(v reflect.Value)
| 257 | } |
| 258 | |
| 259 | func (e *jsonExporter) exportData(v reflect.Value) interface{} { |
| 260 | switch v.Kind() { |
| 261 | case reflect.Ptr, reflect.Interface: |
| 262 | if !v.IsNil() { |
| 263 | return e.exportData(v.Elem()) |
| 264 | } |
| 265 | case reflect.Slice: |
| 266 | a := make([]interface{}, v.Len()) |
| 267 | for i := 0; i < v.Len(); i++ { |
| 268 | a[i] = e.exportData(v.Index(i)) |
| 269 | } |
| 270 | return a |
| 271 | case reflect.Map: |
| 272 | t := reflect.MapOf(v.Type().Key(), emptyInterfaceType) |
| 273 | m := reflect.MakeMapWithSize(t, v.Len()) |
| 274 | iter := v.MapRange() |
| 275 | for iter.Next() { |
| 276 | ve := reflect.ValueOf(e.exportData(iter.Value())) |
| 277 | m.SetMapIndex(iter.Key(), ve) |
| 278 | } |
| 279 | return m.Interface() |
| 280 | case reflect.Struct: |
| 281 | if v.CanAddr() && reflect.PointerTo(v.Type()).Implements(exportableType) { |
| 282 | ve := v.Addr().Interface().(exportable) |
| 283 | return ve.ExportData(e.fields) |
| 284 | } else if v.Type().Implements(exportableType) { |
| 285 | ve := v.Interface().(exportable) |
| 286 | return ve.ExportData(e.fields) |
| 287 | } |
| 288 | } |
| 289 | return v.Interface() |
| 290 | } |
| 291 | |
| 292 | type exportable interface { |
| 293 | ExportData([]string) map[string]interface{} |
no test coverage detected