in types.go [367:419]
func (c cfgSub) reify(opts *options) (interface{}, error) {
parentFields := opts.activeFields
defer func() { opts.activeFields = parentFields }()
fields := c.c.fields.dict()
arr := c.c.fields.array()
switch {
case len(fields) == 0 && len(arr) == 0 && arr != nil:
// preserve empty arrays
return []interface{}{}, nil
case len(fields) == 0 && len(arr) == 0:
return nil, nil
case len(fields) > 0 && len(arr) == 0:
m := make(map[string]interface{})
for k, v := range fields {
opts.activeFields = newFieldSet(parentFields)
var err error
if m[k], err = v.reify(opts); err != nil {
return nil, err
}
}
return m, nil
case len(fields) == 0 && len(arr) > 0:
m := make([]interface{}, len(arr))
for i, v := range arr {
opts.activeFields = newFieldSet(parentFields)
var err error
if m[i], err = v.reify(opts); err != nil {
return nil, err
}
}
return m, nil
default:
m := make(map[string]interface{})
for k, v := range fields {
opts.activeFields = newFieldSet(parentFields)
var err error
if m[k], err = v.reify(opts); err != nil {
return nil, err
}
}
for i, v := range arr {
opts.activeFields = newFieldSet(parentFields)
var err error
m[fmt.Sprintf("%d", i)], err = v.reify(opts)
if err != nil {
return nil, err
}
}
return m, nil
}
}