in path.go [217:254]
func (p cfgPath) SetValue(cfg *Config, opt *options, val value) Error {
fields := p.fields
node := value(cfgSub{cfg})
// 1. iterate until intermediate node not having some required child node
for ; len(fields) > 1; fields = fields[1:] {
field := fields[0]
v, err := field.GetValue(opt, node)
if err != nil {
if err.Reason() == ErrMissing {
break
}
return err
}
if isNil(v) {
break
}
node = v
}
// 2. build intermediate nodes from bottom up
for ; len(fields) > 1; fields = fields[:len(fields)-1] {
field := fields[len(fields)-1]
next := New()
next.metadata = val.meta()
v := cfgSub{next}
if err := field.SetValue(opt, v, val); err != nil {
return err
}
val = v
}
// 3. insert new sub-tree into config
return fields[0].SetValue(opt, node, val)
}