When using resolvers, use last value only.

This fixes an issue where the value and all its hooks would
be applied for each resolver, making it difficult to compose multiple
config files.
This commit is contained in:
Alec Thomas
2020-07-10 16:37:03 +10:00
parent e10381694b
commit 055081422d
+20 -12
View File
@@ -444,26 +444,34 @@ func (c *Context) Resolve() error {
if _, ok := c.values[flag.Value]; ok {
continue
}
// Pick the last resolved value.
var selected interface{}
for _, resolver := range resolvers {
s, err := resolver.Resolve(c, path, flag)
if err != nil {
return err
return errors.Wrap(err, flag.ShortSummary())
}
if s == nil {
continue
}
scan := Scan().PushTyped(s, FlagValueToken)
delete(c.values, flag.Value)
err = flag.Parse(scan, c.getValue(flag.Value))
if err != nil {
return err
}
inserted = append(inserted, &Path{
Flag: flag,
Resolved: true,
})
selected = s
}
if selected == nil {
continue
}
scan := Scan().PushTyped(selected, FlagValueToken)
delete(c.values, flag.Value)
err := flag.Parse(scan, c.getValue(flag.Value))
if err != nil {
return err
}
inserted = append(inserted, &Path{
Flag: flag,
Resolved: true,
})
}
}
c.Path = append(inserted, c.Path...)