in merge.go [329:367]
func normalizeStructInto(cfg *Config, opts *options, from reflect.Value) Error {
v := chaseValue(from)
numField := v.NumField()
for i := 0; i < numField; i++ {
var err Error
stField := v.Type().Field(i)
// ignore non exported fields
if rune, _ := utf8.DecodeRuneInString(stField.Name); !unicode.IsUpper(rune) {
continue
}
name, tagOpts := parseTags(stField.Tag.Get(opts.tag))
if tagOpts.ignore {
continue
}
if tagOpts.squash {
vField := chaseValue(v.Field(i))
switch vField.Kind() {
case reflect.Struct:
err = normalizeStructInto(cfg, opts, vField)
case reflect.Map:
err = normalizeMapInto(cfg, opts, vField)
default:
return raiseSquashNeedsObject(cfg, opts, stField.Name, vField.Type())
}
} else {
name = fieldName(name, stField.Name)
err = normalizeSetField(cfg, opts, tagOpts, name, v.Field(i))
}
if err != nil {
return err
}
}
return nil
}