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:
+12
-4
@@ -444,18 +444,27 @@ func (c *Context) Resolve() error {
|
|||||||
if _, ok := c.values[flag.Value]; ok {
|
if _, ok := c.values[flag.Value]; ok {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Pick the last resolved value.
|
||||||
|
var selected interface{}
|
||||||
for _, resolver := range resolvers {
|
for _, resolver := range resolvers {
|
||||||
s, err := resolver.Resolve(c, path, flag)
|
s, err := resolver.Resolve(c, path, flag)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return errors.Wrap(err, flag.ShortSummary())
|
||||||
}
|
}
|
||||||
if s == nil {
|
if s == nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
selected = s
|
||||||
|
}
|
||||||
|
|
||||||
scan := Scan().PushTyped(s, FlagValueToken)
|
if selected == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
scan := Scan().PushTyped(selected, FlagValueToken)
|
||||||
delete(c.values, flag.Value)
|
delete(c.values, flag.Value)
|
||||||
err = flag.Parse(scan, c.getValue(flag.Value))
|
err := flag.Parse(scan, c.getValue(flag.Value))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -465,7 +474,6 @@ func (c *Context) Resolve() error {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
c.Path = append(inserted, c.Path...)
|
c.Path = append(inserted, c.Path...)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user