func normalize()

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)
}