in merge.go [257:289]
func normalize(opts *options, from interface{}) (*Config, Error) {
vFrom := chaseValue(reflect.ValueOf(from))
switch vFrom.Type() {
case tConfig:
return vFrom.Addr().Interface().(*Config), nil
case tConfigMap:
return normalizeMap(opts, vFrom)
default:
// try to convert vFrom into Config (rebranding)
if v, ok := tryTConfig(vFrom); ok {
return v.Addr().Interface().(*Config), nil
}
// normalize given map/struct value
switch vFrom.Kind() {
case reflect.Struct:
return normalizeStruct(opts, vFrom)
case reflect.Map:
return normalizeMap(opts, vFrom)
case reflect.Array, reflect.Slice:
tmp, err := normalizeArray(opts, tagOptions{}, context{}, vFrom)
if err != nil {
return nil, err
}
c, _ := tmp.toConfig(opts)
return c, nil
}
}
return nil, raiseInvalidTopLevelType(from, opts.meta)
}