func normalizeSetField()

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