Add ActionableFlag interface instead of modifying Flag interface directly

This commit is contained in:
Wendell Sun 2022-05-01 00:24:13 +08:00
parent 14366f7030
commit 619958c3d2
No known key found for this signature in database
GPG Key ID: C1231D5B4615398A
2 changed files with 10 additions and 3 deletions

6
app.go
View File

@ -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
}
}
}
}

View File

@ -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