in merge.go [369:402]
func normalizeSetField(
cfg *Config,
opts *options,
tagOpts tagOptions,
name string,
v reflect.Value,
) Error {
val, err := normalizeValue(opts, tagOpts, context{}, v)
if err != nil {
return err
}
p := parsePathWithOpts(name, opts)
old, err := p.GetValue(cfg, opts)
if err != nil {
if err.Reason() != ErrMissing {
return err
}
old = nil
}
switch {
case !isNil(old) && isNil(val):
return nil
case isNil(old):
return p.SetValue(cfg, opts, val)
case isSub(old) && isSub(val):
cfgOld, _ := old.toConfig(opts)
cfgVal, _ := val.toConfig(opts)
return mergeConfig(opts, cfgOld, cfgVal)
default:
return raiseDuplicateKey(cfg, name)
}
}