From 055081422d565c9c1c0fe787c87d79fdccfa3a81 Mon Sep 17 00:00:00 2001 From: Alec Thomas Date: Fri, 10 Jul 2020 16:37:03 +1000 Subject: [PATCH] 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. --- context.go | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/context.go b/context.go index 73086c8..ada529e 100644 --- a/context.go +++ b/context.go @@ -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...)