(w io.Writer, rv reflect.Value)
| 213 | } |
| 214 | |
| 215 | func encodeReflectInterface(w io.Writer, rv reflect.Value) error { |
| 216 | // Get concrete value and dereference pointers. |
| 217 | for rv.Kind() == reflect.Ptr || rv.Kind() == reflect.Interface { |
| 218 | if rv.IsNil() { |
| 219 | return writeStr(w, "null") |
| 220 | } |
| 221 | rv = rv.Elem() |
| 222 | } |
| 223 | |
| 224 | // Look up the name of the concrete type |
| 225 | name := typeRegistry.name(rv.Type()) |
| 226 | if name == "" { |
| 227 | return fmt.Errorf("cannot encode unregistered type %v", rv.Type()) |
| 228 | } |
| 229 | |
| 230 | // Write value wrapped in interface envelope |
| 231 | if err := writeStr(w, fmt.Sprintf(`{"type":%q,"value":`, name)); err != nil { |
| 232 | return err |
| 233 | } |
| 234 | if err := encodeReflect(w, rv); err != nil { |
| 235 | return err |
| 236 | } |
| 237 | return writeStr(w, "}") |
| 238 | } |
| 239 | |
| 240 | func encodeStdlib(w io.Writer, v interface{}) error { |
| 241 | // Doesn't stream the output because that adds a newline, as per: |
no test coverage detected
searching dependent graphs…