diff --git a/app.go b/app.go index 2a291ae40a..9f72f1b4f3 100644 --- a/app.go +++ b/app.go @@ -664,8 +664,10 @@ func runFlagActions(c *Context, fs []Flag) error { } } if isSet { - if err := f.RunAction(c); err != nil { - return err + if af, ok := f.(ActionableFlag); ok { + if err := af.RunAction(c); err != nil { + return err + } } } } diff --git a/flag.go b/flag.go index a1e37fc5a0..7b5ec498c7 100644 --- a/flag.go +++ b/flag.go @@ -83,6 +83,12 @@ func (f FlagsByName) Swap(i, j int) { f[i], f[j] = f[j], f[i] } +// ActionableFlag is an interface that wraps Flag interface and RunAction operation. +type ActionableFlag interface { + Flag + RunAction(*Context) error +} + // Flag is a common interface related to parsing flags in cli. // For more advanced flag parsing techniques, it is recommended that // this interface be implemented. @@ -92,7 +98,6 @@ type Flag interface { Apply(*flag.FlagSet) error Names() []string IsSet() bool - RunAction(*Context) error } // RequiredFlag is an interface that allows us to mark flags as required