From ab68d8a69d1a479c8f6c1e3d06aef76e99797015 Mon Sep 17 00:00:00 2001 From: Naveen Gogineni Date: Sun, 4 Sep 2022 22:18:41 -0400 Subject: [PATCH 1/4] Cleanup: Collapse flag interfaces --- app_test.go | 16 ++ flag.go | 21 +- flag_bool.go | 20 -- flag_duration.go | 20 -- flag_float64.go | 20 -- flag_float64_slice.go | 20 -- flag_generic.go | 20 -- flag_int.go | 20 -- flag_int64.go | 20 -- flag_int64_slice.go | 20 -- flag_int_slice.go | 20 -- flag_path.go | 20 -- flag_string.go | 20 -- flag_string_slice.go | 20 -- flag_timestamp.go | 20 -- flag_uint.go | 20 -- flag_uint64.go | 20 -- godoc-current.txt | 127 +++++----- internal/genflags/generated.gotmpl | 29 ++- internal/genflags/generated_test.gotmpl | 23 +- internal/genflags/spec.go | 17 +- sliceflag.go | 2 - zz_generated.flags.go | 300 ++++++++++++++++++++++++ zz_generated.flags_test.go | 132 +++++------ 24 files changed, 489 insertions(+), 478 deletions(-) diff --git a/app_test.go b/app_test.go index 437af25911..53d6f64f21 100644 --- a/app_test.go +++ b/app_test.go @@ -2252,6 +2252,22 @@ func (c *customBoolFlag) IsSet() bool { return false } +func (c *customBoolFlag) IsRequired() bool { + return false +} + +func (c *customBoolFlag) IsVisible() bool { + return false +} + +func (c *customBoolFlag) GetCategory() string { + return "" +} + +func (c *customBoolFlag) GetEnvVars() []string { + return nil +} + func TestCustomFlagsUnused(t *testing.T) { app := &App{ Flags: []Flag{&customBoolFlag{"custom"}}, diff --git a/flag.go b/flag.go index dbed577cdc..4580a3e74d 100644 --- a/flag.go +++ b/flag.go @@ -93,14 +93,20 @@ type Flag interface { Apply(*flag.FlagSet) error Names() []string IsSet() bool + IsRequired() bool + // IsVisible returns true if the flag is not hidden, otherwise false + IsVisible() bool + GetCategory() string + // GetUsage returns the usage string for the flag + GetUsage() string + // GetEnvVars returns the env vars for this flag + GetEnvVars() []string } // RequiredFlag is an interface that allows us to mark flags as required // it allows flags required flags to be backwards compatible with the Flag interface type RequiredFlag interface { Flag - - IsRequired() bool } // DocGenerationFlag is an interface that allows documentation generation for the flag @@ -110,34 +116,23 @@ type DocGenerationFlag interface { // TakesValue returns true if the flag takes a value, otherwise false TakesValue() bool - // GetUsage returns the usage string for the flag - GetUsage() string - // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. GetValue() string // GetDefaultText returns the default text for this flag GetDefaultText() string - - // GetEnvVars returns the env vars for this flag - GetEnvVars() []string } // VisibleFlag is an interface that allows to check if a flag is visible type VisibleFlag interface { Flag - - // IsVisible returns true if the flag is not hidden, otherwise false - IsVisible() bool } // CategorizableFlag is an interface that allows us to potentially // use a flag in a categorized representation. type CategorizableFlag interface { VisibleFlag - - GetCategory() string } func flagSet(name string, flags []Flag) (*flag.FlagSet, error) { diff --git a/flag_bool.go b/flag_bool.go index b21d5163c9..c8a01bb11e 100644 --- a/flag_bool.go +++ b/flag_bool.go @@ -6,21 +6,6 @@ import ( "strconv" ) -// TakesValue returns true of the flag takes a value, otherwise false -func (f *BoolFlag) TakesValue() bool { - return false -} - -// GetUsage returns the usage string for the flag -func (f *BoolFlag) GetUsage() string { - return f.Usage -} - -// GetCategory returns the category for the flag -func (f *BoolFlag) GetCategory() string { - return f.Category -} - // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *BoolFlag) GetValue() string { @@ -35,11 +20,6 @@ func (f *BoolFlag) GetDefaultText() string { return fmt.Sprintf("%v", f.Value) } -// GetEnvVars returns the env vars for this flag -func (f *BoolFlag) GetEnvVars() []string { - return f.EnvVars -} - // Apply populates the flag given the flag set and environment func (f *BoolFlag) Apply(set *flag.FlagSet) error { if val, source, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { diff --git a/flag_duration.go b/flag_duration.go index 5178c6ae12..6f4ece0185 100644 --- a/flag_duration.go +++ b/flag_duration.go @@ -6,21 +6,6 @@ import ( "time" ) -// TakesValue returns true of the flag takes a value, otherwise false -func (f *DurationFlag) TakesValue() bool { - return true -} - -// GetUsage returns the usage string for the flag -func (f *DurationFlag) GetUsage() string { - return f.Usage -} - -// GetCategory returns the category for the flag -func (f *DurationFlag) GetCategory() string { - return f.Category -} - // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *DurationFlag) GetValue() string { @@ -35,11 +20,6 @@ func (f *DurationFlag) GetDefaultText() string { return f.GetValue() } -// GetEnvVars returns the env vars for this flag -func (f *DurationFlag) GetEnvVars() []string { - return f.EnvVars -} - // Apply populates the flag given the flag set and environment func (f *DurationFlag) Apply(set *flag.FlagSet) error { if val, source, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { diff --git a/flag_float64.go b/flag_float64.go index 2d31739bc6..4c8778fc34 100644 --- a/flag_float64.go +++ b/flag_float64.go @@ -6,21 +6,6 @@ import ( "strconv" ) -// TakesValue returns true of the flag takes a value, otherwise false -func (f *Float64Flag) TakesValue() bool { - return true -} - -// GetUsage returns the usage string for the flag -func (f *Float64Flag) GetUsage() string { - return f.Usage -} - -// GetCategory returns the category for the flag -func (f *Float64Flag) GetCategory() string { - return f.Category -} - // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *Float64Flag) GetValue() string { @@ -35,11 +20,6 @@ func (f *Float64Flag) GetDefaultText() string { return f.GetValue() } -// GetEnvVars returns the env vars for this flag -func (f *Float64Flag) GetEnvVars() []string { - return f.EnvVars -} - // Apply populates the flag given the flag set and environment func (f *Float64Flag) Apply(set *flag.FlagSet) error { if val, source, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { diff --git a/flag_float64_slice.go b/flag_float64_slice.go index 031ec1d1aa..911cb84b43 100644 --- a/flag_float64_slice.go +++ b/flag_float64_slice.go @@ -86,21 +86,6 @@ func (f *Float64SliceFlag) String() string { return withEnvHint(f.GetEnvVars(), stringifyFloat64SliceFlag(f)) } -// TakesValue returns true if the flag takes a value, otherwise false -func (f *Float64SliceFlag) TakesValue() bool { - return true -} - -// GetUsage returns the usage string for the flag -func (f *Float64SliceFlag) GetUsage() string { - return f.Usage -} - -// GetCategory returns the category for the flag -func (f *Float64SliceFlag) GetCategory() string { - return f.Category -} - // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *Float64SliceFlag) GetValue() string { @@ -118,11 +103,6 @@ func (f *Float64SliceFlag) GetDefaultText() string { return f.GetValue() } -// GetEnvVars returns the env vars for this flag -func (f *Float64SliceFlag) GetEnvVars() []string { - return f.EnvVars -} - // Apply populates the flag given the flag set and environment func (f *Float64SliceFlag) Apply(set *flag.FlagSet) error { // apply any default diff --git a/flag_generic.go b/flag_generic.go index 680eeb9d71..256aea66a5 100644 --- a/flag_generic.go +++ b/flag_generic.go @@ -11,21 +11,6 @@ type Generic interface { String() string } -// TakesValue returns true of the flag takes a value, otherwise false -func (f *GenericFlag) TakesValue() bool { - return true -} - -// GetUsage returns the usage string for the flag -func (f *GenericFlag) GetUsage() string { - return f.Usage -} - -// GetCategory returns the category for the flag -func (f *GenericFlag) GetCategory() string { - return f.Category -} - // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *GenericFlag) GetValue() string { @@ -43,11 +28,6 @@ func (f *GenericFlag) GetDefaultText() string { return f.GetValue() } -// GetEnvVars returns the env vars for this flag -func (f *GenericFlag) GetEnvVars() []string { - return f.EnvVars -} - // Apply takes the flagset and calls Set on the generic flag with the value // provided by the user for parsing by the flag func (f GenericFlag) Apply(set *flag.FlagSet) error { diff --git a/flag_int.go b/flag_int.go index c70b889858..d4d8959fd9 100644 --- a/flag_int.go +++ b/flag_int.go @@ -6,21 +6,6 @@ import ( "strconv" ) -// TakesValue returns true of the flag takes a value, otherwise false -func (f *IntFlag) TakesValue() bool { - return true -} - -// GetUsage returns the usage string for the flag -func (f *IntFlag) GetUsage() string { - return f.Usage -} - -// GetCategory returns the category for the flag -func (f *IntFlag) GetCategory() string { - return f.Category -} - // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *IntFlag) GetValue() string { @@ -35,11 +20,6 @@ func (f *IntFlag) GetDefaultText() string { return f.GetValue() } -// GetEnvVars returns the env vars for this flag -func (f *IntFlag) GetEnvVars() []string { - return f.EnvVars -} - // Apply populates the flag given the flag set and environment func (f *IntFlag) Apply(set *flag.FlagSet) error { if val, source, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { diff --git a/flag_int64.go b/flag_int64.go index 5e7038cfb1..fdb65b950a 100644 --- a/flag_int64.go +++ b/flag_int64.go @@ -6,21 +6,6 @@ import ( "strconv" ) -// TakesValue returns true of the flag takes a value, otherwise false -func (f *Int64Flag) TakesValue() bool { - return true -} - -// GetUsage returns the usage string for the flag -func (f *Int64Flag) GetUsage() string { - return f.Usage -} - -// GetCategory returns the category for the flag -func (f *Int64Flag) GetCategory() string { - return f.Category -} - // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *Int64Flag) GetValue() string { @@ -35,11 +20,6 @@ func (f *Int64Flag) GetDefaultText() string { return f.GetValue() } -// GetEnvVars returns the env vars for this flag -func (f *Int64Flag) GetEnvVars() []string { - return f.EnvVars -} - // Apply populates the flag given the flag set and environment func (f *Int64Flag) Apply(set *flag.FlagSet) error { if val, source, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { diff --git a/flag_int64_slice.go b/flag_int64_slice.go index 657aaaaf33..0346663b5e 100644 --- a/flag_int64_slice.go +++ b/flag_int64_slice.go @@ -87,21 +87,6 @@ func (f *Int64SliceFlag) String() string { return withEnvHint(f.GetEnvVars(), stringifyInt64SliceFlag(f)) } -// TakesValue returns true of the flag takes a value, otherwise false -func (f *Int64SliceFlag) TakesValue() bool { - return true -} - -// GetUsage returns the usage string for the flag -func (f *Int64SliceFlag) GetUsage() string { - return f.Usage -} - -// GetCategory returns the category for the flag -func (f *Int64SliceFlag) GetCategory() string { - return f.Category -} - // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *Int64SliceFlag) GetValue() string { @@ -119,11 +104,6 @@ func (f *Int64SliceFlag) GetDefaultText() string { return f.GetValue() } -// GetEnvVars returns the env vars for this flag -func (f *Int64SliceFlag) GetEnvVars() []string { - return f.EnvVars -} - // Apply populates the flag given the flag set and environment func (f *Int64SliceFlag) Apply(set *flag.FlagSet) error { // apply any default diff --git a/flag_int_slice.go b/flag_int_slice.go index 7c383935ac..a24fc8de0e 100644 --- a/flag_int_slice.go +++ b/flag_int_slice.go @@ -98,21 +98,6 @@ func (f *IntSliceFlag) String() string { return withEnvHint(f.GetEnvVars(), stringifyIntSliceFlag(f)) } -// TakesValue returns true of the flag takes a value, otherwise false -func (f *IntSliceFlag) TakesValue() bool { - return true -} - -// GetUsage returns the usage string for the flag -func (f *IntSliceFlag) GetUsage() string { - return f.Usage -} - -// GetCategory returns the category for the flag -func (f *IntSliceFlag) GetCategory() string { - return f.Category -} - // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *IntSliceFlag) GetValue() string { @@ -130,11 +115,6 @@ func (f *IntSliceFlag) GetDefaultText() string { return f.GetValue() } -// GetEnvVars returns the env vars for this flag -func (f *IntSliceFlag) GetEnvVars() []string { - return f.EnvVars -} - // Apply populates the flag given the flag set and environment func (f *IntSliceFlag) Apply(set *flag.FlagSet) error { // apply any default diff --git a/flag_path.go b/flag_path.go index 7c87a8900d..e622c40819 100644 --- a/flag_path.go +++ b/flag_path.go @@ -7,21 +7,6 @@ import ( type Path = string -// TakesValue returns true of the flag takes a value, otherwise false -func (f *PathFlag) TakesValue() bool { - return true -} - -// GetUsage returns the usage string for the flag -func (f *PathFlag) GetUsage() string { - return f.Usage -} - -// GetCategory returns the category for the flag -func (f *PathFlag) GetCategory() string { - return f.Category -} - // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *PathFlag) GetValue() string { @@ -39,11 +24,6 @@ func (f *PathFlag) GetDefaultText() string { return fmt.Sprintf("%q", f.Value) } -// GetEnvVars returns the env vars for this flag -func (f *PathFlag) GetEnvVars() []string { - return f.EnvVars -} - // Apply populates the flag given the flag set and environment func (f *PathFlag) Apply(set *flag.FlagSet) error { if val, _, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { diff --git a/flag_string.go b/flag_string.go index c8da38f92d..31cd89dc27 100644 --- a/flag_string.go +++ b/flag_string.go @@ -5,21 +5,6 @@ import ( "fmt" ) -// TakesValue returns true of the flag takes a value, otherwise false -func (f *StringFlag) TakesValue() bool { - return true -} - -// GetUsage returns the usage string for the flag -func (f *StringFlag) GetUsage() string { - return f.Usage -} - -// GetCategory returns the category for the flag -func (f *StringFlag) GetCategory() string { - return f.Category -} - // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *StringFlag) GetValue() string { @@ -37,11 +22,6 @@ func (f *StringFlag) GetDefaultText() string { return fmt.Sprintf("%q", f.Value) } -// GetEnvVars returns the env vars for this flag -func (f *StringFlag) GetEnvVars() []string { - return f.EnvVars -} - // Apply populates the flag given the flag set and environment func (f *StringFlag) Apply(set *flag.FlagSet) error { if val, _, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { diff --git a/flag_string_slice.go b/flag_string_slice.go index bcdfd4c554..d56dce103e 100644 --- a/flag_string_slice.go +++ b/flag_string_slice.go @@ -76,21 +76,6 @@ func (f *StringSliceFlag) String() string { return withEnvHint(f.GetEnvVars(), stringifyStringSliceFlag(f)) } -// TakesValue returns true of the flag takes a value, otherwise false -func (f *StringSliceFlag) TakesValue() bool { - return true -} - -// GetUsage returns the usage string for the flag -func (f *StringSliceFlag) GetUsage() string { - return f.Usage -} - -// GetCategory returns the category for the flag -func (f *StringSliceFlag) GetCategory() string { - return f.Category -} - // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *StringSliceFlag) GetValue() string { @@ -108,11 +93,6 @@ func (f *StringSliceFlag) GetDefaultText() string { return f.GetValue() } -// GetEnvVars returns the env vars for this flag -func (f *StringSliceFlag) GetEnvVars() []string { - return f.EnvVars -} - // Apply populates the flag given the flag set and environment func (f *StringSliceFlag) Apply(set *flag.FlagSet) error { // apply any default diff --git a/flag_timestamp.go b/flag_timestamp.go index 80e1f470be..275fd1edd1 100644 --- a/flag_timestamp.go +++ b/flag_timestamp.go @@ -72,21 +72,6 @@ func (t *Timestamp) Get() interface{} { return *t } -// TakesValue returns true of the flag takes a value, otherwise false -func (f *TimestampFlag) TakesValue() bool { - return true -} - -// GetUsage returns the usage string for the flag -func (f *TimestampFlag) GetUsage() string { - return f.Usage -} - -// GetCategory returns the category for the flag -func (f *TimestampFlag) GetCategory() string { - return f.Category -} - // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *TimestampFlag) GetValue() string { @@ -104,11 +89,6 @@ func (f *TimestampFlag) GetDefaultText() string { return f.GetValue() } -// GetEnvVars returns the env vars for this flag -func (f *TimestampFlag) GetEnvVars() []string { - return f.EnvVars -} - // Apply populates the flag given the flag set and environment func (f *TimestampFlag) Apply(set *flag.FlagSet) error { if f.Layout == "" { diff --git a/flag_uint.go b/flag_uint.go index 6092b1ad69..c3e8fcbb61 100644 --- a/flag_uint.go +++ b/flag_uint.go @@ -6,21 +6,6 @@ import ( "strconv" ) -// TakesValue returns true of the flag takes a value, otherwise false -func (f *UintFlag) TakesValue() bool { - return true -} - -// GetUsage returns the usage string for the flag -func (f *UintFlag) GetUsage() string { - return f.Usage -} - -// GetCategory returns the category for the flag -func (f *UintFlag) GetCategory() string { - return f.Category -} - // Apply populates the flag given the flag set and environment func (f *UintFlag) Apply(set *flag.FlagSet) error { if val, source, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { @@ -60,11 +45,6 @@ func (f *UintFlag) GetDefaultText() string { return f.GetValue() } -// GetEnvVars returns the env vars for this flag -func (f *UintFlag) GetEnvVars() []string { - return f.EnvVars -} - // Get returns the flag’s value in the given Context. func (f *UintFlag) Get(ctx *Context) uint { return ctx.Uint(f.Name) diff --git a/flag_uint64.go b/flag_uint64.go index a37f30d9fc..cacdcc6ede 100644 --- a/flag_uint64.go +++ b/flag_uint64.go @@ -6,21 +6,6 @@ import ( "strconv" ) -// TakesValue returns true of the flag takes a value, otherwise false -func (f *Uint64Flag) TakesValue() bool { - return true -} - -// GetUsage returns the usage string for the flag -func (f *Uint64Flag) GetUsage() string { - return f.Usage -} - -// GetCategory returns the category for the flag -func (f *Uint64Flag) GetCategory() string { - return f.Category -} - // Apply populates the flag given the flag set and environment func (f *Uint64Flag) Apply(set *flag.FlagSet) error { if val, source, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { @@ -60,11 +45,6 @@ func (f *Uint64Flag) GetDefaultText() string { return f.GetValue() } -// GetEnvVars returns the env vars for this flag -func (f *Uint64Flag) GetEnvVars() []string { - return f.EnvVars -} - // Get returns the flag’s value in the given Context. func (f *Uint64Flag) Get(ctx *Context) uint64 { return ctx.Uint64(f.Name) diff --git a/godoc-current.txt b/godoc-current.txt index 1ba48cc659..afdb3d5d77 100644 --- a/godoc-current.txt +++ b/godoc-current.txt @@ -64,8 +64,8 @@ GLOBAL OPTIONS: COPYRIGHT: {{wrap .Copyright 3}}{{end}} ` - AppHelpTemplate is the text template for the Default help topic. cli.go uses - text/template to render templates. You can render custom help text by + AppHelpTemplate is the text template for the Default help topic. cli.go + uses text/template to render templates. You can render custom help text by setting this variable. var CommandHelpTemplate = `NAME: @@ -201,9 +201,9 @@ func DefaultAppComplete(cCtx *Context) func DefaultCompleteWithFlags(cmd *Command) func(cCtx *Context) func FlagNames(name string, aliases []string) []string func HandleAction(action interface{}, cCtx *Context) (err error) - HandleAction attempts to figure out which Action signature was used. If it's - an ActionFunc or a func with the legacy signature for Action, the func is - run! + HandleAction attempts to figure out which Action signature was used. + If it's an ActionFunc or a func with the legacy signature for Action, + the func is run! func HandleExitCoder(err error) HandleExitCoder handles errors implementing ExitCoder by printing their @@ -360,14 +360,14 @@ func (a *App) RunAsSubcommand(ctx *Context) (err error) to generate command-specific flags func (a *App) RunContext(ctx context.Context, arguments []string) (err error) - RunContext is like Run except it takes a Context that will be passed to its - commands and sub-commands. Through this, you can propagate timeouts and + RunContext is like Run except it takes a Context that will be passed to + its commands and sub-commands. Through this, you can propagate timeouts and cancellation requests func (a *App) Setup() - Setup runs initialization code to ensure all data structures are ready for - `Run` or inspection prior to `Run`. It is internally called by `Run`, but - will return early if setup has already happened. + Setup runs initialization code to ensure all data structures are ready + for `Run` or inspection prior to `Run`. It is internally called by `Run`, + but will return early if setup has already happened. func (a *App) ToFishCompletion() (string, error) ToFishCompletion creates a fish completion string for the `*App` The @@ -460,7 +460,7 @@ func (f *BoolFlag) Get(ctx *Context) bool Get returns the flag’s value in the given Context. func (f *BoolFlag) GetCategory() string - GetCategory returns the category for the flag + GetCategory returns the category of the flag func (f *BoolFlag) GetDefaultText() string GetDefaultText returns the default text for this flag @@ -491,12 +491,10 @@ func (f *BoolFlag) String() string String returns a readable representation of this value (for usage defaults) func (f *BoolFlag) TakesValue() bool - TakesValue returns true of the flag takes a value, otherwise false + TakesValue returns true if the flag takes a value, otherwise false type CategorizableFlag interface { VisibleFlag - - GetCategory() string } CategorizableFlag is an interface that allows us to potentially use a flag in a categorized representation. @@ -707,18 +705,12 @@ type DocGenerationFlag interface { // TakesValue returns true if the flag takes a value, otherwise false TakesValue() bool - // GetUsage returns the usage string for the flag - GetUsage() string - // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. GetValue() string // GetDefaultText returns the default text for this flag GetDefaultText() string - - // GetEnvVars returns the env vars for this flag - GetEnvVars() []string } DocGenerationFlag is an interface that allows documentation generation for the flag @@ -750,7 +742,7 @@ func (f *DurationFlag) Get(ctx *Context) time.Duration Get returns the flag’s value in the given Context. func (f *DurationFlag) GetCategory() string - GetCategory returns the category for the flag + GetCategory returns the category of the flag func (f *DurationFlag) GetDefaultText() string GetDefaultText returns the default text for this flag @@ -781,7 +773,7 @@ func (f *DurationFlag) String() string String returns a readable representation of this value (for usage defaults) func (f *DurationFlag) TakesValue() bool - TakesValue returns true of the flag takes a value, otherwise false + TakesValue returns true if the flag takes a value, otherwise false type ErrorFormatter interface { Format(s fmt.State, verb rune) @@ -799,9 +791,9 @@ func Exit(message interface{}, exitCode int) ExitCoder Exit wraps a message and exit code into an error, which by default is handled with a call to os.Exit during default error handling. - This is the simplest way to trigger a non-zero exit code for an App without - having to call os.Exit manually. During testing, this behavior can be - avoided by overiding the ExitErrHandler function on an App or the + This is the simplest way to trigger a non-zero exit code for an App + without having to call os.Exit manually. During testing, this behavior + can be avoided by overiding the ExitErrHandler function on an App or the package-global OsExiter function. func NewExitError(message interface{}, exitCode int) ExitCoder @@ -820,6 +812,14 @@ type Flag interface { Apply(*flag.FlagSet) error Names() []string IsSet() bool + IsRequired() bool + // IsVisible returns true if the flag is not hidden, otherwise false + IsVisible() bool + GetCategory() string + // GetUsage returns the usage string for the flag + GetUsage() string + // GetEnvVars returns the env vars for this flag + GetEnvVars() []string } Flag is a common interface related to parsing flags in cli. For more advanced flag parsing techniques, it is recommended that this interface be @@ -923,7 +923,7 @@ func (f *Float64Flag) Get(ctx *Context) float64 Get returns the flag’s value in the given Context. func (f *Float64Flag) GetCategory() string - GetCategory returns the category for the flag + GetCategory returns the category of the flag func (f *Float64Flag) GetDefaultText() string GetDefaultText returns the default text for this flag @@ -954,7 +954,7 @@ func (f *Float64Flag) String() string String returns a readable representation of this value (for usage defaults) func (f *Float64Flag) TakesValue() bool - TakesValue returns true of the flag takes a value, otherwise false + TakesValue returns true if the flag takes a value, otherwise false type Float64Slice struct { // Has unexported fields. @@ -1006,7 +1006,7 @@ func (f *Float64SliceFlag) Get(ctx *Context) []float64 Get returns the flag’s value in the given Context. func (f *Float64SliceFlag) GetCategory() string - GetCategory returns the category for the flag + GetCategory returns the category of the flag func (f *Float64SliceFlag) GetDefaultText() string GetDefaultText returns the default text for this flag @@ -1081,7 +1081,7 @@ func (f *GenericFlag) Get(ctx *Context) interface{} Get returns the flag’s value in the given Context. func (f *GenericFlag) GetCategory() string - GetCategory returns the category for the flag + GetCategory returns the category of the flag func (f *GenericFlag) GetDefaultText() string GetDefaultText returns the default text for this flag @@ -1112,7 +1112,7 @@ func (f *GenericFlag) String() string String returns a readable representation of this value (for usage defaults) func (f *GenericFlag) TakesValue() bool - TakesValue returns true of the flag takes a value, otherwise false + TakesValue returns true if the flag takes a value, otherwise false type Int64Flag struct { Name string @@ -1141,7 +1141,7 @@ func (f *Int64Flag) Get(ctx *Context) int64 Get returns the flag’s value in the given Context. func (f *Int64Flag) GetCategory() string - GetCategory returns the category for the flag + GetCategory returns the category of the flag func (f *Int64Flag) GetDefaultText() string GetDefaultText returns the default text for this flag @@ -1172,7 +1172,7 @@ func (f *Int64Flag) String() string String returns a readable representation of this value (for usage defaults) func (f *Int64Flag) TakesValue() bool - TakesValue returns true of the flag takes a value, otherwise false + TakesValue returns true if the flag takes a value, otherwise false type Int64Slice struct { // Has unexported fields. @@ -1224,7 +1224,7 @@ func (f *Int64SliceFlag) Get(ctx *Context) []int64 Get returns the flag’s value in the given Context. func (f *Int64SliceFlag) GetCategory() string - GetCategory returns the category for the flag + GetCategory returns the category of the flag func (f *Int64SliceFlag) GetDefaultText() string GetDefaultText returns the default text for this flag @@ -1261,7 +1261,7 @@ func (f *Int64SliceFlag) String() string String returns a readable representation of this value (for usage defaults) func (f *Int64SliceFlag) TakesValue() bool - TakesValue returns true of the flag takes a value, otherwise false + TakesValue returns true if the flag takes a value, otherwise false type IntFlag struct { Name string @@ -1290,7 +1290,7 @@ func (f *IntFlag) Get(ctx *Context) int Get returns the flag’s value in the given Context. func (f *IntFlag) GetCategory() string - GetCategory returns the category for the flag + GetCategory returns the category of the flag func (f *IntFlag) GetDefaultText() string GetDefaultText returns the default text for this flag @@ -1321,7 +1321,7 @@ func (f *IntFlag) String() string String returns a readable representation of this value (for usage defaults) func (f *IntFlag) TakesValue() bool - TakesValue returns true of the flag takes a value, otherwise false + TakesValue returns true if the flag takes a value, otherwise false type IntSlice struct { // Has unexported fields. @@ -1377,7 +1377,7 @@ func (f *IntSliceFlag) Get(ctx *Context) []int Get returns the flag’s value in the given Context. func (f *IntSliceFlag) GetCategory() string - GetCategory returns the category for the flag + GetCategory returns the category of the flag func (f *IntSliceFlag) GetDefaultText() string GetDefaultText returns the default text for this flag @@ -1414,7 +1414,7 @@ func (f *IntSliceFlag) String() string String returns a readable representation of this value (for usage defaults) func (f *IntSliceFlag) TakesValue() bool - TakesValue returns true of the flag takes a value, otherwise false + TakesValue returns true if the flag takes a value, otherwise false type MultiError interface { error @@ -1431,8 +1431,8 @@ type MultiInt64Flag = SliceFlag[*Int64SliceFlag, []int64, int64] directly, as Value and/or Destination. See also SliceFlag. type MultiIntFlag = SliceFlag[*IntSliceFlag, []int, int] - MultiIntFlag extends IntSliceFlag with support for using slices directly, as - Value and/or Destination. See also SliceFlag. + MultiIntFlag extends IntSliceFlag with support for using slices directly, + as Value and/or Destination. See also SliceFlag. type MultiStringFlag = SliceFlag[*StringSliceFlag, []string, string] MultiStringFlag extends StringSliceFlag with support for using slices @@ -1475,7 +1475,7 @@ func (f *PathFlag) Get(ctx *Context) string Get returns the flag’s value in the given Context. func (f *PathFlag) GetCategory() string - GetCategory returns the category for the flag + GetCategory returns the category of the flag func (f *PathFlag) GetDefaultText() string GetDefaultText returns the default text for this flag @@ -1506,15 +1506,13 @@ func (f *PathFlag) String() string String returns a readable representation of this value (for usage defaults) func (f *PathFlag) TakesValue() bool - TakesValue returns true of the flag takes a value, otherwise false + TakesValue returns true if the flag takes a value, otherwise false type RequiredFlag interface { Flag - - IsRequired() bool } - RequiredFlag is an interface that allows us to mark flags as required it - allows flags required flags to be backwards compatible with the Flag + RequiredFlag is an interface that allows us to mark flags as required + it allows flags required flags to be backwards compatible with the Flag interface type Serializer interface { @@ -1527,9 +1525,9 @@ type SliceFlag[T SliceFlagTarget[E], S ~[]E, E any] struct { Value S Destination *S } - SliceFlag extends implementations like StringSliceFlag and IntSliceFlag with - support for using slices directly, as Value and/or Destination. See also - SliceFlagTarget, MultiStringFlag, MultiFloat64Flag, MultiInt64Flag, + SliceFlag extends implementations like StringSliceFlag and IntSliceFlag + with support for using slices directly, as Value and/or Destination. + See also SliceFlagTarget, MultiStringFlag, MultiFloat64Flag, MultiInt64Flag, MultiIntFlag. func (x *SliceFlag[T, S, E]) Apply(set *flag.FlagSet) error @@ -1564,9 +1562,7 @@ func (x *SliceFlag[T, S, E]) TakesValue() bool type SliceFlagTarget[E any] interface { Flag - RequiredFlag DocGenerationFlag - VisibleFlag CategorizableFlag // SetValue should propagate the given slice to the target, ideally as a new value. @@ -1612,7 +1608,7 @@ func (f *StringFlag) Get(ctx *Context) string Get returns the flag’s value in the given Context. func (f *StringFlag) GetCategory() string - GetCategory returns the category for the flag + GetCategory returns the category of the flag func (f *StringFlag) GetDefaultText() string GetDefaultText returns the default text for this flag @@ -1643,7 +1639,7 @@ func (f *StringFlag) String() string String returns a readable representation of this value (for usage defaults) func (f *StringFlag) TakesValue() bool - TakesValue returns true of the flag takes a value, otherwise false + TakesValue returns true if the flag takes a value, otherwise false type StringSlice struct { // Has unexported fields. @@ -1697,7 +1693,7 @@ func (f *StringSliceFlag) Get(ctx *Context) []string Get returns the flag’s value in the given Context. func (f *StringSliceFlag) GetCategory() string - GetCategory returns the category for the flag + GetCategory returns the category of the flag func (f *StringSliceFlag) GetDefaultText() string GetDefaultText returns the default text for this flag @@ -1734,7 +1730,7 @@ func (f *StringSliceFlag) String() string String returns a readable representation of this value (for usage defaults) func (f *StringSliceFlag) TakesValue() bool - TakesValue returns true of the flag takes a value, otherwise false + TakesValue returns true if the flag takes a value, otherwise false type SuggestCommandFunc func(commands []*Command, provided string) string @@ -1800,7 +1796,7 @@ func (f *TimestampFlag) Get(ctx *Context) *time.Time Get returns the flag’s value in the given Context. func (f *TimestampFlag) GetCategory() string - GetCategory returns the category for the flag + GetCategory returns the category of the flag func (f *TimestampFlag) GetDefaultText() string GetDefaultText returns the default text for this flag @@ -1831,7 +1827,7 @@ func (f *TimestampFlag) String() string String returns a readable representation of this value (for usage defaults) func (f *TimestampFlag) TakesValue() bool - TakesValue returns true of the flag takes a value, otherwise false + TakesValue returns true if the flag takes a value, otherwise false type Uint64Flag struct { Name string @@ -1860,7 +1856,7 @@ func (f *Uint64Flag) Get(ctx *Context) uint64 Get returns the flag’s value in the given Context. func (f *Uint64Flag) GetCategory() string - GetCategory returns the category for the flag + GetCategory returns the category of the flag func (f *Uint64Flag) GetDefaultText() string GetDefaultText returns the default text for this flag @@ -1891,7 +1887,7 @@ func (f *Uint64Flag) String() string String returns a readable representation of this value (for usage defaults) func (f *Uint64Flag) TakesValue() bool - TakesValue returns true of the flag takes a value, otherwise false + TakesValue returns true if the flag takes a value, otherwise false type UintFlag struct { Name string @@ -1920,7 +1916,7 @@ func (f *UintFlag) Get(ctx *Context) uint Get returns the flag’s value in the given Context. func (f *UintFlag) GetCategory() string - GetCategory returns the category for the flag + GetCategory returns the category of the flag func (f *UintFlag) GetDefaultText() string GetDefaultText returns the default text for this flag @@ -1951,13 +1947,10 @@ func (f *UintFlag) String() string String returns a readable representation of this value (for usage defaults) func (f *UintFlag) TakesValue() bool - TakesValue returns true of the flag takes a value, otherwise false + TakesValue returns true if the flag takes a value, otherwise false type VisibleFlag interface { Flag - - // IsVisible returns true if the flag is not hidden, otherwise false - IsVisible() bool } VisibleFlag is an interface that allows to check if a flag is visible @@ -1986,9 +1979,9 @@ func InitInputSource(flags []cli.Flag, createInputSource func() (InputSourceCont that are supported by the input source func InitInputSourceWithContext(flags []cli.Flag, createInputSource func(cCtx *cli.Context) (InputSourceContext, error)) cli.BeforeFunc - InitInputSourceWithContext is used to to setup an InputSourceContext on a - cli.Command Before method. It will create a new input source based on the - func provided with potentially using existing cli.Context values to + InitInputSourceWithContext is used to to setup an InputSourceContext on + a cli.Command Before method. It will create a new input source based on + the func provided with potentially using existing cli.Context values to initialize itself. If there is no error it will then apply the new input source to any flags that are supported by the input source diff --git a/internal/genflags/generated.gotmpl b/internal/genflags/generated.gotmpl index 8b82ccfb1d..d4b1538013 100644 --- a/internal/genflags/generated.gotmpl +++ b/internal/genflags/generated.gotmpl @@ -45,21 +45,38 @@ func (f *{{.TypeName}}) Names() []string { return {{$.UrfaveCLINamespace}}FlagNames(f.Name, f.Aliases) } -{{end}}{{/* /if .GenerateFlagInterface */}} - -{{if .GenerateRequiredFlagInterface}} // IsRequired returns whether or not the flag is required func (f *{{.TypeName}}) IsRequired() bool { return f.Required } -{{end}}{{/* /if .GenerateRequiredFlagInterface */}} -{{if .GenerateVisibleFlagInterface}} // IsVisible returns true if the flag is not hidden, otherwise false func (f *{{.TypeName}}) IsVisible() bool { return !f.Hidden } -{{end}}{{/* /if .GenerateVisibleFlagInterface */}} + +// GetCategory returns the category of the flag +func (f *{{.TypeName}}) GetCategory() string { + return f.Category +} + +// GetUsage returns the usage string for the flag +func (f *{{.TypeName}}) GetUsage() string { + return f.Usage +} + +// GetEnvVars returns the env vars for this flag +func (f *{{.TypeName}}) GetEnvVars() []string { + return f.EnvVars +} + +// TakesValue returns true if the flag takes a value, otherwise false +func (f *{{.TypeName}}) TakesValue() bool { + return "{{.TypeName }}" != "BoolFlag" +} + +{{end}}{{/* /if .GenerateFlagInterface */}} + {{end}}{{/* /range .SortedFlagTypes */}} // vim{{/* 👻 */}}:ro diff --git a/internal/genflags/generated_test.gotmpl b/internal/genflags/generated_test.gotmpl index 52de4e4bf4..83229b06ba 100644 --- a/internal/genflags/generated_test.gotmpl +++ b/internal/genflags/generated_test.gotmpl @@ -10,31 +10,30 @@ func Test{{.TypeName}}_SatisfiesFlagInterface(t *testing.T) { _ = f.IsSet() _ = f.Names() } -{{end}} - -{{if .GenerateFmtStringerInterface}} -func Test{{.TypeName}}_SatisfiesFmtStringerInterface(t *testing.T) { - var f fmt.Stringer = &{{$.UrfaveCLITestNamespace}}{{.TypeName}}{} - _ = f.String() -} -{{end}} - -{{if .GenerateRequiredFlagInterface}} func Test{{.TypeName}}_SatisfiesRequiredFlagInterface(t *testing.T) { var f {{$.UrfaveCLITestNamespace}}RequiredFlag = &{{$.UrfaveCLITestNamespace}}{{.TypeName}}{} _ = f.IsRequired() } -{{end}} -{{if .GenerateVisibleFlagInterface}} func Test{{.TypeName}}_SatisfiesVisibleFlagInterface(t *testing.T) { var f {{$.UrfaveCLITestNamespace}}VisibleFlag = &{{$.UrfaveCLITestNamespace}}{{.TypeName}}{} _ = f.IsVisible() } + {{end}} + +{{if .GenerateFmtStringerInterface}} +func Test{{.TypeName}}_SatisfiesFmtStringerInterface(t *testing.T) { + var f fmt.Stringer = &{{$.UrfaveCLITestNamespace}}{{.TypeName}}{} + + _ = f.String() +} +{{end}} + + {{end}} // vim{{/* 👻 */}}:ro diff --git a/internal/genflags/spec.go b/internal/genflags/spec.go index a7afb22143..de537a55a1 100644 --- a/internal/genflags/spec.go +++ b/internal/genflags/spec.go @@ -39,10 +39,11 @@ func (gfs *Spec) SortedFlagTypes() []*FlagType { } type FlagTypeConfig struct { - SkipInterfaces []string `yaml:"skip_interfaces"` - StructFields []*FlagStructField `yaml:"struct_fields"` - TypeName string `yaml:"type_name"` - ValuePointer bool `yaml:"value_pointer"` + SkipInterfaces []string `yaml:"skip_interfaces"` + StructFields []*FlagStructField `yaml:"struct_fields"` + TypeName string `yaml:"type_name"` + ValuePointer bool `yaml:"value_pointer"` + DoesntNeedValue bool `yaml:"doesnt_need_value"` } type FlagStructField struct { @@ -83,14 +84,6 @@ func (ft *FlagType) GenerateFlagInterface() bool { return ft.skipInterfaceNamed("Flag") } -func (ft *FlagType) GenerateRequiredFlagInterface() bool { - return ft.skipInterfaceNamed("RequiredFlag") -} - -func (ft *FlagType) GenerateVisibleFlagInterface() bool { - return ft.skipInterfaceNamed("VisibleFlag") -} - func (ft *FlagType) skipInterfaceNamed(name string) bool { if ft.Config == nil { return true diff --git a/sliceflag.go b/sliceflag.go index b2ca59041f..6cc5266f15 100644 --- a/sliceflag.go +++ b/sliceflag.go @@ -21,9 +21,7 @@ type ( // update). SliceFlagTarget[E any] interface { Flag - RequiredFlag DocGenerationFlag - VisibleFlag CategorizableFlag // SetValue should propagate the given slice to the target, ideally as a new value. diff --git a/zz_generated.flags.go b/zz_generated.flags.go index b89566f900..1ee72d39e9 100644 --- a/zz_generated.flags.go +++ b/zz_generated.flags.go @@ -44,6 +44,26 @@ func (f *Float64SliceFlag) IsVisible() bool { return !f.Hidden } +// GetCategory returns the category of the flag +func (f *Float64SliceFlag) GetCategory() string { + return f.Category +} + +// GetUsage returns the usage string for the flag +func (f *Float64SliceFlag) GetUsage() string { + return f.Usage +} + +// GetEnvVars returns the env vars for this flag +func (f *Float64SliceFlag) GetEnvVars() []string { + return f.EnvVars +} + +// TakesValue returns true if the flag takes a value, otherwise false +func (f *Float64SliceFlag) TakesValue() bool { + return "Float64SliceFlag" != "BoolFlag" +} + // GenericFlag is a flag with type Generic type GenericFlag struct { Name string @@ -91,6 +111,26 @@ func (f *GenericFlag) IsVisible() bool { return !f.Hidden } +// GetCategory returns the category of the flag +func (f *GenericFlag) GetCategory() string { + return f.Category +} + +// GetUsage returns the usage string for the flag +func (f *GenericFlag) GetUsage() string { + return f.Usage +} + +// GetEnvVars returns the env vars for this flag +func (f *GenericFlag) GetEnvVars() []string { + return f.EnvVars +} + +// TakesValue returns true if the flag takes a value, otherwise false +func (f *GenericFlag) TakesValue() bool { + return "GenericFlag" != "BoolFlag" +} + // Int64SliceFlag is a flag with type *Int64Slice type Int64SliceFlag struct { Name string @@ -131,6 +171,26 @@ func (f *Int64SliceFlag) IsVisible() bool { return !f.Hidden } +// GetCategory returns the category of the flag +func (f *Int64SliceFlag) GetCategory() string { + return f.Category +} + +// GetUsage returns the usage string for the flag +func (f *Int64SliceFlag) GetUsage() string { + return f.Usage +} + +// GetEnvVars returns the env vars for this flag +func (f *Int64SliceFlag) GetEnvVars() []string { + return f.EnvVars +} + +// TakesValue returns true if the flag takes a value, otherwise false +func (f *Int64SliceFlag) TakesValue() bool { + return "Int64SliceFlag" != "BoolFlag" +} + // IntSliceFlag is a flag with type *IntSlice type IntSliceFlag struct { Name string @@ -171,6 +231,26 @@ func (f *IntSliceFlag) IsVisible() bool { return !f.Hidden } +// GetCategory returns the category of the flag +func (f *IntSliceFlag) GetCategory() string { + return f.Category +} + +// GetUsage returns the usage string for the flag +func (f *IntSliceFlag) GetUsage() string { + return f.Usage +} + +// GetEnvVars returns the env vars for this flag +func (f *IntSliceFlag) GetEnvVars() []string { + return f.EnvVars +} + +// TakesValue returns true if the flag takes a value, otherwise false +func (f *IntSliceFlag) TakesValue() bool { + return "IntSliceFlag" != "BoolFlag" +} + // PathFlag is a flag with type Path type PathFlag struct { Name string @@ -218,6 +298,26 @@ func (f *PathFlag) IsVisible() bool { return !f.Hidden } +// GetCategory returns the category of the flag +func (f *PathFlag) GetCategory() string { + return f.Category +} + +// GetUsage returns the usage string for the flag +func (f *PathFlag) GetUsage() string { + return f.Usage +} + +// GetEnvVars returns the env vars for this flag +func (f *PathFlag) GetEnvVars() []string { + return f.EnvVars +} + +// TakesValue returns true if the flag takes a value, otherwise false +func (f *PathFlag) TakesValue() bool { + return "PathFlag" != "BoolFlag" +} + // StringSliceFlag is a flag with type *StringSlice type StringSliceFlag struct { Name string @@ -260,6 +360,26 @@ func (f *StringSliceFlag) IsVisible() bool { return !f.Hidden } +// GetCategory returns the category of the flag +func (f *StringSliceFlag) GetCategory() string { + return f.Category +} + +// GetUsage returns the usage string for the flag +func (f *StringSliceFlag) GetUsage() string { + return f.Usage +} + +// GetEnvVars returns the env vars for this flag +func (f *StringSliceFlag) GetEnvVars() []string { + return f.EnvVars +} + +// TakesValue returns true if the flag takes a value, otherwise false +func (f *StringSliceFlag) TakesValue() bool { + return "StringSliceFlag" != "BoolFlag" +} + // TimestampFlag is a flag with type *Timestamp type TimestampFlag struct { Name string @@ -309,6 +429,26 @@ func (f *TimestampFlag) IsVisible() bool { return !f.Hidden } +// GetCategory returns the category of the flag +func (f *TimestampFlag) GetCategory() string { + return f.Category +} + +// GetUsage returns the usage string for the flag +func (f *TimestampFlag) GetUsage() string { + return f.Usage +} + +// GetEnvVars returns the env vars for this flag +func (f *TimestampFlag) GetEnvVars() []string { + return f.EnvVars +} + +// TakesValue returns true if the flag takes a value, otherwise false +func (f *TimestampFlag) TakesValue() bool { + return "TimestampFlag" != "BoolFlag" +} + // BoolFlag is a flag with type bool type BoolFlag struct { Name string @@ -354,6 +494,26 @@ func (f *BoolFlag) IsVisible() bool { return !f.Hidden } +// GetCategory returns the category of the flag +func (f *BoolFlag) GetCategory() string { + return f.Category +} + +// GetUsage returns the usage string for the flag +func (f *BoolFlag) GetUsage() string { + return f.Usage +} + +// GetEnvVars returns the env vars for this flag +func (f *BoolFlag) GetEnvVars() []string { + return f.EnvVars +} + +// TakesValue returns true if the flag takes a value, otherwise false +func (f *BoolFlag) TakesValue() bool { + return "BoolFlag" != "BoolFlag" +} + // Float64Flag is a flag with type float64 type Float64Flag struct { Name string @@ -399,6 +559,26 @@ func (f *Float64Flag) IsVisible() bool { return !f.Hidden } +// GetCategory returns the category of the flag +func (f *Float64Flag) GetCategory() string { + return f.Category +} + +// GetUsage returns the usage string for the flag +func (f *Float64Flag) GetUsage() string { + return f.Usage +} + +// GetEnvVars returns the env vars for this flag +func (f *Float64Flag) GetEnvVars() []string { + return f.EnvVars +} + +// TakesValue returns true if the flag takes a value, otherwise false +func (f *Float64Flag) TakesValue() bool { + return "Float64Flag" != "BoolFlag" +} + // IntFlag is a flag with type int type IntFlag struct { Name string @@ -444,6 +624,26 @@ func (f *IntFlag) IsVisible() bool { return !f.Hidden } +// GetCategory returns the category of the flag +func (f *IntFlag) GetCategory() string { + return f.Category +} + +// GetUsage returns the usage string for the flag +func (f *IntFlag) GetUsage() string { + return f.Usage +} + +// GetEnvVars returns the env vars for this flag +func (f *IntFlag) GetEnvVars() []string { + return f.EnvVars +} + +// TakesValue returns true if the flag takes a value, otherwise false +func (f *IntFlag) TakesValue() bool { + return "IntFlag" != "BoolFlag" +} + // Int64Flag is a flag with type int64 type Int64Flag struct { Name string @@ -489,6 +689,26 @@ func (f *Int64Flag) IsVisible() bool { return !f.Hidden } +// GetCategory returns the category of the flag +func (f *Int64Flag) GetCategory() string { + return f.Category +} + +// GetUsage returns the usage string for the flag +func (f *Int64Flag) GetUsage() string { + return f.Usage +} + +// GetEnvVars returns the env vars for this flag +func (f *Int64Flag) GetEnvVars() []string { + return f.EnvVars +} + +// TakesValue returns true if the flag takes a value, otherwise false +func (f *Int64Flag) TakesValue() bool { + return "Int64Flag" != "BoolFlag" +} + // StringFlag is a flag with type string type StringFlag struct { Name string @@ -536,6 +756,26 @@ func (f *StringFlag) IsVisible() bool { return !f.Hidden } +// GetCategory returns the category of the flag +func (f *StringFlag) GetCategory() string { + return f.Category +} + +// GetUsage returns the usage string for the flag +func (f *StringFlag) GetUsage() string { + return f.Usage +} + +// GetEnvVars returns the env vars for this flag +func (f *StringFlag) GetEnvVars() []string { + return f.EnvVars +} + +// TakesValue returns true if the flag takes a value, otherwise false +func (f *StringFlag) TakesValue() bool { + return "StringFlag" != "BoolFlag" +} + // DurationFlag is a flag with type time.Duration type DurationFlag struct { Name string @@ -581,6 +821,26 @@ func (f *DurationFlag) IsVisible() bool { return !f.Hidden } +// GetCategory returns the category of the flag +func (f *DurationFlag) GetCategory() string { + return f.Category +} + +// GetUsage returns the usage string for the flag +func (f *DurationFlag) GetUsage() string { + return f.Usage +} + +// GetEnvVars returns the env vars for this flag +func (f *DurationFlag) GetEnvVars() []string { + return f.EnvVars +} + +// TakesValue returns true if the flag takes a value, otherwise false +func (f *DurationFlag) TakesValue() bool { + return "DurationFlag" != "BoolFlag" +} + // UintFlag is a flag with type uint type UintFlag struct { Name string @@ -626,6 +886,26 @@ func (f *UintFlag) IsVisible() bool { return !f.Hidden } +// GetCategory returns the category of the flag +func (f *UintFlag) GetCategory() string { + return f.Category +} + +// GetUsage returns the usage string for the flag +func (f *UintFlag) GetUsage() string { + return f.Usage +} + +// GetEnvVars returns the env vars for this flag +func (f *UintFlag) GetEnvVars() []string { + return f.EnvVars +} + +// TakesValue returns true if the flag takes a value, otherwise false +func (f *UintFlag) TakesValue() bool { + return "UintFlag" != "BoolFlag" +} + // Uint64Flag is a flag with type uint64 type Uint64Flag struct { Name string @@ -671,4 +951,24 @@ func (f *Uint64Flag) IsVisible() bool { return !f.Hidden } +// GetCategory returns the category of the flag +func (f *Uint64Flag) GetCategory() string { + return f.Category +} + +// GetUsage returns the usage string for the flag +func (f *Uint64Flag) GetUsage() string { + return f.Usage +} + +// GetEnvVars returns the env vars for this flag +func (f *Uint64Flag) GetEnvVars() []string { + return f.EnvVars +} + +// TakesValue returns true if the flag takes a value, otherwise false +func (f *Uint64Flag) TakesValue() bool { + return "Uint64Flag" != "BoolFlag" +} + // vim:ro diff --git a/zz_generated.flags_test.go b/zz_generated.flags_test.go index 1d9afdaa71..37dd857228 100644 --- a/zz_generated.flags_test.go +++ b/zz_generated.flags_test.go @@ -35,12 +35,6 @@ func TestGenericFlag_SatisfiesFlagInterface(t *testing.T) { _ = f.Names() } -func TestGenericFlag_SatisfiesFmtStringerInterface(t *testing.T) { - var f fmt.Stringer = &cli.GenericFlag{} - - _ = f.String() -} - func TestGenericFlag_SatisfiesRequiredFlagInterface(t *testing.T) { var f cli.RequiredFlag = &cli.GenericFlag{} @@ -53,6 +47,12 @@ func TestGenericFlag_SatisfiesVisibleFlagInterface(t *testing.T) { _ = f.IsVisible() } +func TestGenericFlag_SatisfiesFmtStringerInterface(t *testing.T) { + var f fmt.Stringer = &cli.GenericFlag{} + + _ = f.String() +} + func TestInt64SliceFlag_SatisfiesFlagInterface(t *testing.T) { var f cli.Flag = &cli.Int64SliceFlag{} @@ -98,12 +98,6 @@ func TestPathFlag_SatisfiesFlagInterface(t *testing.T) { _ = f.Names() } -func TestPathFlag_SatisfiesFmtStringerInterface(t *testing.T) { - var f fmt.Stringer = &cli.PathFlag{} - - _ = f.String() -} - func TestPathFlag_SatisfiesRequiredFlagInterface(t *testing.T) { var f cli.RequiredFlag = &cli.PathFlag{} @@ -116,6 +110,12 @@ func TestPathFlag_SatisfiesVisibleFlagInterface(t *testing.T) { _ = f.IsVisible() } +func TestPathFlag_SatisfiesFmtStringerInterface(t *testing.T) { + var f fmt.Stringer = &cli.PathFlag{} + + _ = f.String() +} + func TestStringSliceFlag_SatisfiesFlagInterface(t *testing.T) { var f cli.Flag = &cli.StringSliceFlag{} @@ -142,12 +142,6 @@ func TestTimestampFlag_SatisfiesFlagInterface(t *testing.T) { _ = f.Names() } -func TestTimestampFlag_SatisfiesFmtStringerInterface(t *testing.T) { - var f fmt.Stringer = &cli.TimestampFlag{} - - _ = f.String() -} - func TestTimestampFlag_SatisfiesRequiredFlagInterface(t *testing.T) { var f cli.RequiredFlag = &cli.TimestampFlag{} @@ -160,6 +154,12 @@ func TestTimestampFlag_SatisfiesVisibleFlagInterface(t *testing.T) { _ = f.IsVisible() } +func TestTimestampFlag_SatisfiesFmtStringerInterface(t *testing.T) { + var f fmt.Stringer = &cli.TimestampFlag{} + + _ = f.String() +} + func TestBoolFlag_SatisfiesFlagInterface(t *testing.T) { var f cli.Flag = &cli.BoolFlag{} @@ -167,12 +167,6 @@ func TestBoolFlag_SatisfiesFlagInterface(t *testing.T) { _ = f.Names() } -func TestBoolFlag_SatisfiesFmtStringerInterface(t *testing.T) { - var f fmt.Stringer = &cli.BoolFlag{} - - _ = f.String() -} - func TestBoolFlag_SatisfiesRequiredFlagInterface(t *testing.T) { var f cli.RequiredFlag = &cli.BoolFlag{} @@ -185,6 +179,12 @@ func TestBoolFlag_SatisfiesVisibleFlagInterface(t *testing.T) { _ = f.IsVisible() } +func TestBoolFlag_SatisfiesFmtStringerInterface(t *testing.T) { + var f fmt.Stringer = &cli.BoolFlag{} + + _ = f.String() +} + func TestFloat64Flag_SatisfiesFlagInterface(t *testing.T) { var f cli.Flag = &cli.Float64Flag{} @@ -192,12 +192,6 @@ func TestFloat64Flag_SatisfiesFlagInterface(t *testing.T) { _ = f.Names() } -func TestFloat64Flag_SatisfiesFmtStringerInterface(t *testing.T) { - var f fmt.Stringer = &cli.Float64Flag{} - - _ = f.String() -} - func TestFloat64Flag_SatisfiesRequiredFlagInterface(t *testing.T) { var f cli.RequiredFlag = &cli.Float64Flag{} @@ -210,6 +204,12 @@ func TestFloat64Flag_SatisfiesVisibleFlagInterface(t *testing.T) { _ = f.IsVisible() } +func TestFloat64Flag_SatisfiesFmtStringerInterface(t *testing.T) { + var f fmt.Stringer = &cli.Float64Flag{} + + _ = f.String() +} + func TestIntFlag_SatisfiesFlagInterface(t *testing.T) { var f cli.Flag = &cli.IntFlag{} @@ -217,12 +217,6 @@ func TestIntFlag_SatisfiesFlagInterface(t *testing.T) { _ = f.Names() } -func TestIntFlag_SatisfiesFmtStringerInterface(t *testing.T) { - var f fmt.Stringer = &cli.IntFlag{} - - _ = f.String() -} - func TestIntFlag_SatisfiesRequiredFlagInterface(t *testing.T) { var f cli.RequiredFlag = &cli.IntFlag{} @@ -235,6 +229,12 @@ func TestIntFlag_SatisfiesVisibleFlagInterface(t *testing.T) { _ = f.IsVisible() } +func TestIntFlag_SatisfiesFmtStringerInterface(t *testing.T) { + var f fmt.Stringer = &cli.IntFlag{} + + _ = f.String() +} + func TestInt64Flag_SatisfiesFlagInterface(t *testing.T) { var f cli.Flag = &cli.Int64Flag{} @@ -242,12 +242,6 @@ func TestInt64Flag_SatisfiesFlagInterface(t *testing.T) { _ = f.Names() } -func TestInt64Flag_SatisfiesFmtStringerInterface(t *testing.T) { - var f fmt.Stringer = &cli.Int64Flag{} - - _ = f.String() -} - func TestInt64Flag_SatisfiesRequiredFlagInterface(t *testing.T) { var f cli.RequiredFlag = &cli.Int64Flag{} @@ -260,6 +254,12 @@ func TestInt64Flag_SatisfiesVisibleFlagInterface(t *testing.T) { _ = f.IsVisible() } +func TestInt64Flag_SatisfiesFmtStringerInterface(t *testing.T) { + var f fmt.Stringer = &cli.Int64Flag{} + + _ = f.String() +} + func TestStringFlag_SatisfiesFlagInterface(t *testing.T) { var f cli.Flag = &cli.StringFlag{} @@ -267,12 +267,6 @@ func TestStringFlag_SatisfiesFlagInterface(t *testing.T) { _ = f.Names() } -func TestStringFlag_SatisfiesFmtStringerInterface(t *testing.T) { - var f fmt.Stringer = &cli.StringFlag{} - - _ = f.String() -} - func TestStringFlag_SatisfiesRequiredFlagInterface(t *testing.T) { var f cli.RequiredFlag = &cli.StringFlag{} @@ -285,6 +279,12 @@ func TestStringFlag_SatisfiesVisibleFlagInterface(t *testing.T) { _ = f.IsVisible() } +func TestStringFlag_SatisfiesFmtStringerInterface(t *testing.T) { + var f fmt.Stringer = &cli.StringFlag{} + + _ = f.String() +} + func TestDurationFlag_SatisfiesFlagInterface(t *testing.T) { var f cli.Flag = &cli.DurationFlag{} @@ -292,12 +292,6 @@ func TestDurationFlag_SatisfiesFlagInterface(t *testing.T) { _ = f.Names() } -func TestDurationFlag_SatisfiesFmtStringerInterface(t *testing.T) { - var f fmt.Stringer = &cli.DurationFlag{} - - _ = f.String() -} - func TestDurationFlag_SatisfiesRequiredFlagInterface(t *testing.T) { var f cli.RequiredFlag = &cli.DurationFlag{} @@ -310,6 +304,12 @@ func TestDurationFlag_SatisfiesVisibleFlagInterface(t *testing.T) { _ = f.IsVisible() } +func TestDurationFlag_SatisfiesFmtStringerInterface(t *testing.T) { + var f fmt.Stringer = &cli.DurationFlag{} + + _ = f.String() +} + func TestUintFlag_SatisfiesFlagInterface(t *testing.T) { var f cli.Flag = &cli.UintFlag{} @@ -317,12 +317,6 @@ func TestUintFlag_SatisfiesFlagInterface(t *testing.T) { _ = f.Names() } -func TestUintFlag_SatisfiesFmtStringerInterface(t *testing.T) { - var f fmt.Stringer = &cli.UintFlag{} - - _ = f.String() -} - func TestUintFlag_SatisfiesRequiredFlagInterface(t *testing.T) { var f cli.RequiredFlag = &cli.UintFlag{} @@ -335,6 +329,12 @@ func TestUintFlag_SatisfiesVisibleFlagInterface(t *testing.T) { _ = f.IsVisible() } +func TestUintFlag_SatisfiesFmtStringerInterface(t *testing.T) { + var f fmt.Stringer = &cli.UintFlag{} + + _ = f.String() +} + func TestUint64Flag_SatisfiesFlagInterface(t *testing.T) { var f cli.Flag = &cli.Uint64Flag{} @@ -342,12 +342,6 @@ func TestUint64Flag_SatisfiesFlagInterface(t *testing.T) { _ = f.Names() } -func TestUint64Flag_SatisfiesFmtStringerInterface(t *testing.T) { - var f fmt.Stringer = &cli.Uint64Flag{} - - _ = f.String() -} - func TestUint64Flag_SatisfiesRequiredFlagInterface(t *testing.T) { var f cli.RequiredFlag = &cli.Uint64Flag{} @@ -360,4 +354,10 @@ func TestUint64Flag_SatisfiesVisibleFlagInterface(t *testing.T) { _ = f.IsVisible() } +func TestUint64Flag_SatisfiesFmtStringerInterface(t *testing.T) { + var f fmt.Stringer = &cli.Uint64Flag{} + + _ = f.String() +} + // vim:ro From 268cb973f8f7b1f38999f43122fb3e39b90b0522 Mon Sep 17 00:00:00 2001 From: Naveen Gogineni Date: Sun, 4 Sep 2022 22:51:05 -0400 Subject: [PATCH 2/4] Remove all flag interfaces --- app.go | 4 +- app_test.go | 4 ++ category.go | 18 ++--- context.go | 2 +- docs.go | 8 +-- fish.go | 9 +-- flag-spec.yaml | 5 +- flag.go | 47 +++--------- flag_duration.go | 8 --- flag_float64.go | 8 --- flag_float64_slice.go | 8 --- flag_generic.go | 8 --- flag_int.go | 8 --- flag_int64.go | 8 --- flag_int64_slice.go | 8 --- flag_int_slice.go | 8 --- flag_string_slice.go | 8 --- flag_test.go | 30 +++----- flag_timestamp.go | 8 --- flag_uint.go | 8 --- flag_uint64.go | 8 --- godoc-current.txt | 45 +++--------- internal/genflags/generated.gotmpl | 10 +++ internal/genflags/generated_test.gotmpl | 4 +- internal/genflags/spec.go | 14 ++-- sliceflag.go | 2 - zz_generated.flags.go | 96 +++++++++++++++++++++++++ zz_generated.flags_test.go | 60 ++++++++-------- 28 files changed, 192 insertions(+), 262 deletions(-) diff --git a/app.go b/app.go index 7e64c2d9f8..834873aeb3 100644 --- a/app.go +++ b/app.go @@ -227,9 +227,7 @@ func (a *App) Setup() { a.flagCategories = newFlagCategories() for _, fl := range a.Flags { - if cf, ok := fl.(CategorizableFlag); ok { - a.flagCategories.AddFlag(cf.GetCategory(), cf) - } + a.flagCategories.AddFlag(fl.GetCategory(), fl) } if a.Metadata == nil { diff --git a/app_test.go b/app_test.go index 53d6f64f21..da3981c4fb 100644 --- a/app_test.go +++ b/app_test.go @@ -2268,6 +2268,10 @@ func (c *customBoolFlag) GetEnvVars() []string { return nil } +func (c *customBoolFlag) GetDefaultText() string { + return "" +} + func TestCustomFlagsUnused(t *testing.T) { app := &App{ Flags: []Flag{&customBoolFlag{"custom"}}, diff --git a/category.go b/category.go index 8bf325e203..188937d5bd 100644 --- a/category.go +++ b/category.go @@ -101,9 +101,7 @@ func newFlagCategories() FlagCategories { func newFlagCategoriesFromFlags(fs []Flag) FlagCategories { fc := newFlagCategories() for _, fl := range fs { - if cf, ok := fl.(CategorizableFlag); ok { - fc.AddFlag(cf.GetCategory(), cf) - } + fc.AddFlag(fl.GetCategory(), fl) } return fc @@ -138,7 +136,7 @@ type VisibleFlagCategory interface { // Name returns the category name string Name() string // Flags returns a slice of VisibleFlag sorted by name - Flags() []VisibleFlag + Flags() []Flag } type defaultVisibleFlagCategory struct { @@ -150,21 +148,19 @@ func (fc *defaultVisibleFlagCategory) Name() string { return fc.name } -func (fc *defaultVisibleFlagCategory) Flags() []VisibleFlag { +func (fc *defaultVisibleFlagCategory) Flags() []Flag { vfNames := []string{} for flName, fl := range fc.m { - if vf, ok := fl.(VisibleFlag); ok { - if vf.IsVisible() { - vfNames = append(vfNames, flName) - } + if fl.IsVisible() { + vfNames = append(vfNames, flName) } } sort.Strings(vfNames) - ret := make([]VisibleFlag, len(vfNames)) + ret := make([]Flag, len(vfNames)) for i, flName := range vfNames { - ret[i] = fc.m[flName].(VisibleFlag) + ret[i] = fc.m[flName] } return ret diff --git a/context.go b/context.go index 6b497ed20d..216e95813f 100644 --- a/context.go +++ b/context.go @@ -165,7 +165,7 @@ func (cCtx *Context) lookupFlagSet(name string) *flag.FlagSet { func (cCtx *Context) checkRequiredFlags(flags []Flag) requiredFlagsErr { var missingFlags []string for _, f := range flags { - if rf, ok := f.(RequiredFlag); ok && rf.IsRequired() { + if f.IsRequired() { var flagPresent bool var flagName string diff --git a/docs.go b/docs.go index 8b1c9c8a2c..5a8be0ac60 100644 --- a/docs.go +++ b/docs.go @@ -116,11 +116,7 @@ func prepareFlags( addDetails bool, ) []string { args := []string{} - for _, f := range flags { - flag, ok := f.(DocGenerationFlag) - if !ok { - continue - } + for _, flag := range flags { modifiedArg := opener for _, s := range flag.Names() { @@ -151,7 +147,7 @@ func prepareFlags( } // flagDetails returns a string containing the flags metadata -func flagDetails(flag DocGenerationFlag) string { +func flagDetails(flag Flag) string { description := flag.GetUsage() value := flag.GetValue() if value != "" { diff --git a/fish.go b/fish.go index eec3253cda..70946e1d9e 100644 --- a/fish.go +++ b/fish.go @@ -114,12 +114,7 @@ func (a *App) prepareFishCommands(commands []*Command, allCommands *[]string, pr func (a *App) prepareFishFlags(flags []Flag, previousCommands []string) []string { completions := []string{} - for _, f := range flags { - flag, ok := f.(DocGenerationFlag) - if !ok { - continue - } - + for _, flag := range flags { completion := &strings.Builder{} completion.WriteString(fmt.Sprintf( "complete -c %s -n '%s'", @@ -127,7 +122,7 @@ func (a *App) prepareFishFlags(flags []Flag, previousCommands []string) []string a.fishSubcommandHelper(previousCommands), )) - fishAddFileFlag(f, completion) + fishAddFileFlag(flag, completion) for idx, opt := range flag.Names() { if idx == 0 { diff --git a/flag-spec.yaml b/flag-spec.yaml index 45f054d6e5..3fa2d10367 100644 --- a/flag-spec.yaml +++ b/flag-spec.yaml @@ -3,7 +3,8 @@ # `genflags.Spec` type that maps to this file structure. flag_types: - bool: {} + bool: + no_default_text: true float64: {} int64: {} int: {} @@ -12,12 +13,14 @@ flag_types: uint: {} string: + no_default_text: true struct_fields: - { name: TakesFile, type: bool } Generic: struct_fields: - { name: TakesFile, type: bool } Path: + no_default_text: true struct_fields: - { name: TakesFile, type: bool } diff --git a/flag.go b/flag.go index 4580a3e74d..a5434cbd98 100644 --- a/flag.go +++ b/flag.go @@ -101,38 +101,13 @@ type Flag interface { GetUsage() string // GetEnvVars returns the env vars for this flag GetEnvVars() []string -} - -// RequiredFlag is an interface that allows us to mark flags as required -// it allows flags required flags to be backwards compatible with the Flag interface -type RequiredFlag interface { - Flag -} - -// DocGenerationFlag is an interface that allows documentation generation for the flag -type DocGenerationFlag interface { - Flag - // TakesValue returns true if the flag takes a value, otherwise false TakesValue() bool - + // GetDefaultText returns the default text for this flag + GetDefaultText() string // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. GetValue() string - - // GetDefaultText returns the default text for this flag - GetDefaultText() string -} - -// VisibleFlag is an interface that allows to check if a flag is visible -type VisibleFlag interface { - Flag -} - -// CategorizableFlag is an interface that allows us to potentially -// use a flag in a categorized representation. -type CategorizableFlag interface { - VisibleFlag } func flagSet(name string, flags []Flag) (*flag.FlagSet, error) { @@ -192,7 +167,7 @@ func normalizeFlags(flags []Flag, set *flag.FlagSet) error { func visibleFlags(fl []Flag) []Flag { var visible []Flag for _, f := range fl { - if vf, ok := f.(VisibleFlag); ok && vf.IsVisible() { + if f.IsVisible() { visible = append(visible, f) } } @@ -288,14 +263,8 @@ func formatDefault(format string) string { } func stringifyFlag(f Flag) string { - // enforce DocGeneration interface on flags to avoid reflection - df, ok := f.(DocGenerationFlag) - if !ok { - return "" - } - - placeholder, usage := unquoteUsage(df.GetUsage()) - needsPlaceholder := df.TakesValue() + placeholder, usage := unquoteUsage(f.GetUsage()) + needsPlaceholder := f.TakesValue() if needsPlaceholder && placeholder == "" { placeholder = defaultPlaceholder @@ -303,14 +272,14 @@ func stringifyFlag(f Flag) string { defaultValueString := "" - if s := df.GetDefaultText(); s != "" { + if s := f.GetDefaultText(); s != "" { defaultValueString = fmt.Sprintf(formatDefault("%s"), s) } usageWithDefault := strings.TrimSpace(usage + defaultValueString) - return withEnvHint(df.GetEnvVars(), - fmt.Sprintf("%s\t%s", prefixedNames(df.Names(), placeholder), usageWithDefault)) + return withEnvHint(f.GetEnvVars(), + fmt.Sprintf("%s\t%s", prefixedNames(f.Names(), placeholder), usageWithDefault)) } func stringifyIntSliceFlag(f *IntSliceFlag) string { diff --git a/flag_duration.go b/flag_duration.go index 6f4ece0185..35b376da7f 100644 --- a/flag_duration.go +++ b/flag_duration.go @@ -12,14 +12,6 @@ func (f *DurationFlag) GetValue() string { return f.Value.String() } -// GetDefaultText returns the default text for this flag -func (f *DurationFlag) GetDefaultText() string { - if f.DefaultText != "" { - return f.DefaultText - } - return f.GetValue() -} - // Apply populates the flag given the flag set and environment func (f *DurationFlag) Apply(set *flag.FlagSet) error { if val, source, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { diff --git a/flag_float64.go b/flag_float64.go index 4c8778fc34..b7b8044a53 100644 --- a/flag_float64.go +++ b/flag_float64.go @@ -12,14 +12,6 @@ func (f *Float64Flag) GetValue() string { return fmt.Sprintf("%v", f.Value) } -// GetDefaultText returns the default text for this flag -func (f *Float64Flag) GetDefaultText() string { - if f.DefaultText != "" { - return f.DefaultText - } - return f.GetValue() -} - // Apply populates the flag given the flag set and environment func (f *Float64Flag) Apply(set *flag.FlagSet) error { if val, source, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { diff --git a/flag_float64_slice.go b/flag_float64_slice.go index 911cb84b43..56745c1b59 100644 --- a/flag_float64_slice.go +++ b/flag_float64_slice.go @@ -95,14 +95,6 @@ func (f *Float64SliceFlag) GetValue() string { return "" } -// GetDefaultText returns the default text for this flag -func (f *Float64SliceFlag) GetDefaultText() string { - if f.DefaultText != "" { - return f.DefaultText - } - return f.GetValue() -} - // Apply populates the flag given the flag set and environment func (f *Float64SliceFlag) Apply(set *flag.FlagSet) error { // apply any default diff --git a/flag_generic.go b/flag_generic.go index 256aea66a5..cb20486be8 100644 --- a/flag_generic.go +++ b/flag_generic.go @@ -20,14 +20,6 @@ func (f *GenericFlag) GetValue() string { return "" } -// GetDefaultText returns the default text for this flag -func (f *GenericFlag) GetDefaultText() string { - if f.DefaultText != "" { - return f.DefaultText - } - return f.GetValue() -} - // Apply takes the flagset and calls Set on the generic flag with the value // provided by the user for parsing by the flag func (f GenericFlag) Apply(set *flag.FlagSet) error { diff --git a/flag_int.go b/flag_int.go index d4d8959fd9..908e076162 100644 --- a/flag_int.go +++ b/flag_int.go @@ -12,14 +12,6 @@ func (f *IntFlag) GetValue() string { return fmt.Sprintf("%d", f.Value) } -// GetDefaultText returns the default text for this flag -func (f *IntFlag) GetDefaultText() string { - if f.DefaultText != "" { - return f.DefaultText - } - return f.GetValue() -} - // Apply populates the flag given the flag set and environment func (f *IntFlag) Apply(set *flag.FlagSet) error { if val, source, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { diff --git a/flag_int64.go b/flag_int64.go index fdb65b950a..9f07d79a8c 100644 --- a/flag_int64.go +++ b/flag_int64.go @@ -12,14 +12,6 @@ func (f *Int64Flag) GetValue() string { return fmt.Sprintf("%d", f.Value) } -// GetDefaultText returns the default text for this flag -func (f *Int64Flag) GetDefaultText() string { - if f.DefaultText != "" { - return f.DefaultText - } - return f.GetValue() -} - // Apply populates the flag given the flag set and environment func (f *Int64Flag) Apply(set *flag.FlagSet) error { if val, source, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { diff --git a/flag_int64_slice.go b/flag_int64_slice.go index 0346663b5e..83167092b0 100644 --- a/flag_int64_slice.go +++ b/flag_int64_slice.go @@ -96,14 +96,6 @@ func (f *Int64SliceFlag) GetValue() string { return "" } -// GetDefaultText returns the default text for this flag -func (f *Int64SliceFlag) GetDefaultText() string { - if f.DefaultText != "" { - return f.DefaultText - } - return f.GetValue() -} - // Apply populates the flag given the flag set and environment func (f *Int64SliceFlag) Apply(set *flag.FlagSet) error { // apply any default diff --git a/flag_int_slice.go b/flag_int_slice.go index a24fc8de0e..7865dab0e9 100644 --- a/flag_int_slice.go +++ b/flag_int_slice.go @@ -107,14 +107,6 @@ func (f *IntSliceFlag) GetValue() string { return "" } -// GetDefaultText returns the default text for this flag -func (f *IntSliceFlag) GetDefaultText() string { - if f.DefaultText != "" { - return f.DefaultText - } - return f.GetValue() -} - // Apply populates the flag given the flag set and environment func (f *IntSliceFlag) Apply(set *flag.FlagSet) error { // apply any default diff --git a/flag_string_slice.go b/flag_string_slice.go index d56dce103e..f50323b445 100644 --- a/flag_string_slice.go +++ b/flag_string_slice.go @@ -85,14 +85,6 @@ func (f *StringSliceFlag) GetValue() string { return "" } -// GetDefaultText returns the default text for this flag -func (f *StringSliceFlag) GetDefaultText() string { - if f.DefaultText != "" { - return f.DefaultText - } - return f.GetValue() -} - // Apply populates the flag given the flag set and environment func (f *StringSliceFlag) Apply(set *flag.FlagSet) error { // apply any default diff --git a/flag_test.go b/flag_test.go index e46b1eff45..9e50526218 100644 --- a/flag_test.go +++ b/flag_test.go @@ -144,10 +144,7 @@ func TestFlagsFromEnv(t *testing.T) { defer resetEnv(os.Environ()) os.Clearenv() - f, ok := test.flag.(DocGenerationFlag) - if !ok { - t.Errorf("flag %v needs to implement DocGenerationFlag to retrieve env vars", test.flag) - } + f := test.flag envVarSlice := f.GetEnvVars() _ = os.Setenv(envVarSlice[0], test.input) @@ -179,12 +176,6 @@ func TestFlagsFromEnv(t *testing.T) { } } -type nodocFlag struct { - Flag - - Name string -} - func TestFlagStringifying(t *testing.T) { for _, tc := range []struct { name string @@ -341,11 +332,6 @@ func TestFlagStringifying(t *testing.T) { fl: &UintFlag{Name: "tubes", DefaultText: "13"}, expected: "--tubes value\t(default: 13)", }, - { - name: "nodoc-flag", - fl: &nodocFlag{Name: "scarecrow"}, - expected: "", - }, } { t.Run(tc.name, func(ct *testing.T) { s := stringifyFlag(tc.fl) @@ -2398,43 +2384,43 @@ func TestFlagDefaultValue(t *testing.T) { name: "stringSclice", flag: &StringSliceFlag{Name: "flag", Value: NewStringSlice("default1", "default2")}, toParse: []string{"--flag", "parsed"}, - expect: `--flag value (default: "default1", "default2") (accepts multiple inputs)`, + expect: `--flag value (default: "default1", "default2") (accepts multiple inputs)`, }, { name: "float64Sclice", flag: &Float64SliceFlag{Name: "flag", Value: NewFloat64Slice(1.1, 2.2)}, toParse: []string{"--flag", "13.3"}, - expect: `--flag value (default: 1.1, 2.2) (accepts multiple inputs)`, + expect: `--flag value (default: 1.1, 2.2) (accepts multiple inputs)`, }, { name: "int64Sclice", flag: &Int64SliceFlag{Name: "flag", Value: NewInt64Slice(1, 2)}, toParse: []string{"--flag", "13"}, - expect: `--flag value (default: 1, 2) (accepts multiple inputs)`, + expect: `--flag value (default: 1, 2) (accepts multiple inputs)`, }, { name: "intSclice", flag: &IntSliceFlag{Name: "flag", Value: NewIntSlice(1, 2)}, toParse: []string{"--flag", "13"}, - expect: `--flag value (default: 1, 2) (accepts multiple inputs)`, + expect: `--flag value (default: 1, 2) (accepts multiple inputs)`, }, { name: "string", flag: &StringFlag{Name: "flag", Value: "default"}, toParse: []string{"--flag", "parsed"}, - expect: `--flag value (default: "default")`, + expect: `--flag value (default: "default")`, }, { name: "bool", flag: &BoolFlag{Name: "flag", Value: true}, toParse: []string{"--flag", "false"}, - expect: `--flag (default: true)`, + expect: `--flag (default: true)`, }, { name: "uint64", flag: &Uint64Flag{Name: "flag", Value: 1}, toParse: []string{"--flag", "13"}, - expect: `--flag value (default: 1)`, + expect: `--flag value (default: 1)`, }, } for i, v := range cases { diff --git a/flag_timestamp.go b/flag_timestamp.go index 275fd1edd1..8759b85290 100644 --- a/flag_timestamp.go +++ b/flag_timestamp.go @@ -81,14 +81,6 @@ func (f *TimestampFlag) GetValue() string { return "" } -// GetDefaultText returns the default text for this flag -func (f *TimestampFlag) GetDefaultText() string { - if f.DefaultText != "" { - return f.DefaultText - } - return f.GetValue() -} - // Apply populates the flag given the flag set and environment func (f *TimestampFlag) Apply(set *flag.FlagSet) error { if f.Layout == "" { diff --git a/flag_uint.go b/flag_uint.go index c3e8fcbb61..d03fa7cd5a 100644 --- a/flag_uint.go +++ b/flag_uint.go @@ -37,14 +37,6 @@ func (f *UintFlag) GetValue() string { return fmt.Sprintf("%d", f.Value) } -// GetDefaultText returns the default text for this flag -func (f *UintFlag) GetDefaultText() string { - if f.DefaultText != "" { - return f.DefaultText - } - return f.GetValue() -} - // Get returns the flag’s value in the given Context. func (f *UintFlag) Get(ctx *Context) uint { return ctx.Uint(f.Name) diff --git a/flag_uint64.go b/flag_uint64.go index cacdcc6ede..5c06ab4f59 100644 --- a/flag_uint64.go +++ b/flag_uint64.go @@ -37,14 +37,6 @@ func (f *Uint64Flag) GetValue() string { return fmt.Sprintf("%d", f.Value) } -// GetDefaultText returns the default text for this flag -func (f *Uint64Flag) GetDefaultText() string { - if f.DefaultText != "" { - return f.DefaultText - } - return f.GetValue() -} - // Get returns the flag’s value in the given Context. func (f *Uint64Flag) Get(ctx *Context) uint64 { return ctx.Uint64(f.Name) diff --git a/godoc-current.txt b/godoc-current.txt index afdb3d5d77..79b4245570 100644 --- a/godoc-current.txt +++ b/godoc-current.txt @@ -493,12 +493,6 @@ func (f *BoolFlag) String() string func (f *BoolFlag) TakesValue() bool TakesValue returns true if the flag takes a value, otherwise false -type CategorizableFlag interface { - VisibleFlag -} - CategorizableFlag is an interface that allows us to potentially use a flag - in a categorized representation. - type Command struct { // The name of the command Name string @@ -699,22 +693,6 @@ func (cCtx *Context) Uint64(name string) uint64 func (cCtx *Context) Value(name string) interface{} Value returns the value of the flag corresponding to `name` -type DocGenerationFlag interface { - Flag - - // TakesValue returns true if the flag takes a value, otherwise false - TakesValue() bool - - // GetValue returns the flags value as string representation and an empty - // string if the flag takes no value at all. - GetValue() string - - // GetDefaultText returns the default text for this flag - GetDefaultText() string -} - DocGenerationFlag is an interface that allows documentation generation for - the flag - type DurationFlag struct { Name string @@ -820,6 +798,13 @@ type Flag interface { GetUsage() string // GetEnvVars returns the env vars for this flag GetEnvVars() []string + // TakesValue returns true if the flag takes a value, otherwise false + TakesValue() bool + // GetDefaultText returns the default text for this flag + GetDefaultText() string + // GetValue returns the flags value as string representation and an empty + // string if the flag takes no value at all. + GetValue() string } Flag is a common interface related to parsing flags in cli. For more advanced flag parsing techniques, it is recommended that this interface be @@ -1508,13 +1493,6 @@ func (f *PathFlag) String() string func (f *PathFlag) TakesValue() bool TakesValue returns true if the flag takes a value, otherwise false -type RequiredFlag interface { - Flag -} - RequiredFlag is an interface that allows us to mark flags as required - it allows flags required flags to be backwards compatible with the Flag - interface - type Serializer interface { Serialize() string } @@ -1562,8 +1540,6 @@ func (x *SliceFlag[T, S, E]) TakesValue() bool type SliceFlagTarget[E any] interface { Flag - DocGenerationFlag - CategorizableFlag // SetValue should propagate the given slice to the target, ideally as a new value. // Note that a nil slice should nil/clear any existing value (modelled as ~[]E). @@ -1949,16 +1925,11 @@ func (f *UintFlag) String() string func (f *UintFlag) TakesValue() bool TakesValue returns true if the flag takes a value, otherwise false -type VisibleFlag interface { - Flag -} - VisibleFlag is an interface that allows to check if a flag is visible - type VisibleFlagCategory interface { // Name returns the category name string Name() string // Flags returns a slice of VisibleFlag sorted by name - Flags() []VisibleFlag + Flags() []Flag } VisibleFlagCategory is a category containing flags. diff --git a/internal/genflags/generated.gotmpl b/internal/genflags/generated.gotmpl index d4b1538013..964658e388 100644 --- a/internal/genflags/generated.gotmpl +++ b/internal/genflags/generated.gotmpl @@ -75,6 +75,16 @@ func (f *{{.TypeName}}) TakesValue() bool { return "{{.TypeName }}" != "BoolFlag" } +{{if .GenerateDefaultText}} +// GetDefaultText returns the default text for this flag +func (f *{{.TypeName}}) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + return f.GetValue() +} +{{end}} + {{end}}{{/* /if .GenerateFlagInterface */}} {{end}}{{/* /range .SortedFlagTypes */}} diff --git a/internal/genflags/generated_test.gotmpl b/internal/genflags/generated_test.gotmpl index 83229b06ba..c91f562ef2 100644 --- a/internal/genflags/generated_test.gotmpl +++ b/internal/genflags/generated_test.gotmpl @@ -12,13 +12,13 @@ func Test{{.TypeName}}_SatisfiesFlagInterface(t *testing.T) { } func Test{{.TypeName}}_SatisfiesRequiredFlagInterface(t *testing.T) { - var f {{$.UrfaveCLITestNamespace}}RequiredFlag = &{{$.UrfaveCLITestNamespace}}{{.TypeName}}{} + var f {{$.UrfaveCLITestNamespace}}Flag = &{{$.UrfaveCLITestNamespace}}{{.TypeName}}{} _ = f.IsRequired() } func Test{{.TypeName}}_SatisfiesVisibleFlagInterface(t *testing.T) { - var f {{$.UrfaveCLITestNamespace}}VisibleFlag = &{{$.UrfaveCLITestNamespace}}{{.TypeName}}{} + var f {{$.UrfaveCLITestNamespace}}Flag = &{{$.UrfaveCLITestNamespace}}{{.TypeName}}{} _ = f.IsVisible() } diff --git a/internal/genflags/spec.go b/internal/genflags/spec.go index de537a55a1..5b1d4d3047 100644 --- a/internal/genflags/spec.go +++ b/internal/genflags/spec.go @@ -39,11 +39,11 @@ func (gfs *Spec) SortedFlagTypes() []*FlagType { } type FlagTypeConfig struct { - SkipInterfaces []string `yaml:"skip_interfaces"` - StructFields []*FlagStructField `yaml:"struct_fields"` - TypeName string `yaml:"type_name"` - ValuePointer bool `yaml:"value_pointer"` - DoesntNeedValue bool `yaml:"doesnt_need_value"` + SkipInterfaces []string `yaml:"skip_interfaces"` + StructFields []*FlagStructField `yaml:"struct_fields"` + TypeName string `yaml:"type_name"` + ValuePointer bool `yaml:"value_pointer"` + NoDefaultText bool `yaml:"no_default_text"` } type FlagStructField struct { @@ -84,6 +84,10 @@ func (ft *FlagType) GenerateFlagInterface() bool { return ft.skipInterfaceNamed("Flag") } +func (ft *FlagType) GenerateDefaultText() bool { + return !ft.Config.NoDefaultText +} + func (ft *FlagType) skipInterfaceNamed(name string) bool { if ft.Config == nil { return true diff --git a/sliceflag.go b/sliceflag.go index 6cc5266f15..89f3e0cc89 100644 --- a/sliceflag.go +++ b/sliceflag.go @@ -21,8 +21,6 @@ type ( // update). SliceFlagTarget[E any] interface { Flag - DocGenerationFlag - CategorizableFlag // SetValue should propagate the given slice to the target, ideally as a new value. // Note that a nil slice should nil/clear any existing value (modelled as ~[]E). diff --git a/zz_generated.flags.go b/zz_generated.flags.go index 1ee72d39e9..685d97d7b2 100644 --- a/zz_generated.flags.go +++ b/zz_generated.flags.go @@ -64,6 +64,14 @@ func (f *Float64SliceFlag) TakesValue() bool { return "Float64SliceFlag" != "BoolFlag" } +// GetDefaultText returns the default text for this flag +func (f *Float64SliceFlag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + return f.GetValue() +} + // GenericFlag is a flag with type Generic type GenericFlag struct { Name string @@ -131,6 +139,14 @@ func (f *GenericFlag) TakesValue() bool { return "GenericFlag" != "BoolFlag" } +// GetDefaultText returns the default text for this flag +func (f *GenericFlag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + return f.GetValue() +} + // Int64SliceFlag is a flag with type *Int64Slice type Int64SliceFlag struct { Name string @@ -191,6 +207,14 @@ func (f *Int64SliceFlag) TakesValue() bool { return "Int64SliceFlag" != "BoolFlag" } +// GetDefaultText returns the default text for this flag +func (f *Int64SliceFlag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + return f.GetValue() +} + // IntSliceFlag is a flag with type *IntSlice type IntSliceFlag struct { Name string @@ -251,6 +275,14 @@ func (f *IntSliceFlag) TakesValue() bool { return "IntSliceFlag" != "BoolFlag" } +// GetDefaultText returns the default text for this flag +func (f *IntSliceFlag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + return f.GetValue() +} + // PathFlag is a flag with type Path type PathFlag struct { Name string @@ -380,6 +412,14 @@ func (f *StringSliceFlag) TakesValue() bool { return "StringSliceFlag" != "BoolFlag" } +// GetDefaultText returns the default text for this flag +func (f *StringSliceFlag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + return f.GetValue() +} + // TimestampFlag is a flag with type *Timestamp type TimestampFlag struct { Name string @@ -449,6 +489,14 @@ func (f *TimestampFlag) TakesValue() bool { return "TimestampFlag" != "BoolFlag" } +// GetDefaultText returns the default text for this flag +func (f *TimestampFlag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + return f.GetValue() +} + // BoolFlag is a flag with type bool type BoolFlag struct { Name string @@ -579,6 +627,14 @@ func (f *Float64Flag) TakesValue() bool { return "Float64Flag" != "BoolFlag" } +// GetDefaultText returns the default text for this flag +func (f *Float64Flag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + return f.GetValue() +} + // IntFlag is a flag with type int type IntFlag struct { Name string @@ -644,6 +700,14 @@ func (f *IntFlag) TakesValue() bool { return "IntFlag" != "BoolFlag" } +// GetDefaultText returns the default text for this flag +func (f *IntFlag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + return f.GetValue() +} + // Int64Flag is a flag with type int64 type Int64Flag struct { Name string @@ -709,6 +773,14 @@ func (f *Int64Flag) TakesValue() bool { return "Int64Flag" != "BoolFlag" } +// GetDefaultText returns the default text for this flag +func (f *Int64Flag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + return f.GetValue() +} + // StringFlag is a flag with type string type StringFlag struct { Name string @@ -841,6 +913,14 @@ func (f *DurationFlag) TakesValue() bool { return "DurationFlag" != "BoolFlag" } +// GetDefaultText returns the default text for this flag +func (f *DurationFlag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + return f.GetValue() +} + // UintFlag is a flag with type uint type UintFlag struct { Name string @@ -906,6 +986,14 @@ func (f *UintFlag) TakesValue() bool { return "UintFlag" != "BoolFlag" } +// GetDefaultText returns the default text for this flag +func (f *UintFlag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + return f.GetValue() +} + // Uint64Flag is a flag with type uint64 type Uint64Flag struct { Name string @@ -971,4 +1059,12 @@ func (f *Uint64Flag) TakesValue() bool { return "Uint64Flag" != "BoolFlag" } +// GetDefaultText returns the default text for this flag +func (f *Uint64Flag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + return f.GetValue() +} + // vim:ro diff --git a/zz_generated.flags_test.go b/zz_generated.flags_test.go index 37dd857228..16519e62aa 100644 --- a/zz_generated.flags_test.go +++ b/zz_generated.flags_test.go @@ -17,13 +17,13 @@ func TestFloat64SliceFlag_SatisfiesFlagInterface(t *testing.T) { } func TestFloat64SliceFlag_SatisfiesRequiredFlagInterface(t *testing.T) { - var f cli.RequiredFlag = &cli.Float64SliceFlag{} + var f cli.Flag = &cli.Float64SliceFlag{} _ = f.IsRequired() } func TestFloat64SliceFlag_SatisfiesVisibleFlagInterface(t *testing.T) { - var f cli.VisibleFlag = &cli.Float64SliceFlag{} + var f cli.Flag = &cli.Float64SliceFlag{} _ = f.IsVisible() } @@ -36,13 +36,13 @@ func TestGenericFlag_SatisfiesFlagInterface(t *testing.T) { } func TestGenericFlag_SatisfiesRequiredFlagInterface(t *testing.T) { - var f cli.RequiredFlag = &cli.GenericFlag{} + var f cli.Flag = &cli.GenericFlag{} _ = f.IsRequired() } func TestGenericFlag_SatisfiesVisibleFlagInterface(t *testing.T) { - var f cli.VisibleFlag = &cli.GenericFlag{} + var f cli.Flag = &cli.GenericFlag{} _ = f.IsVisible() } @@ -61,13 +61,13 @@ func TestInt64SliceFlag_SatisfiesFlagInterface(t *testing.T) { } func TestInt64SliceFlag_SatisfiesRequiredFlagInterface(t *testing.T) { - var f cli.RequiredFlag = &cli.Int64SliceFlag{} + var f cli.Flag = &cli.Int64SliceFlag{} _ = f.IsRequired() } func TestInt64SliceFlag_SatisfiesVisibleFlagInterface(t *testing.T) { - var f cli.VisibleFlag = &cli.Int64SliceFlag{} + var f cli.Flag = &cli.Int64SliceFlag{} _ = f.IsVisible() } @@ -80,13 +80,13 @@ func TestIntSliceFlag_SatisfiesFlagInterface(t *testing.T) { } func TestIntSliceFlag_SatisfiesRequiredFlagInterface(t *testing.T) { - var f cli.RequiredFlag = &cli.IntSliceFlag{} + var f cli.Flag = &cli.IntSliceFlag{} _ = f.IsRequired() } func TestIntSliceFlag_SatisfiesVisibleFlagInterface(t *testing.T) { - var f cli.VisibleFlag = &cli.IntSliceFlag{} + var f cli.Flag = &cli.IntSliceFlag{} _ = f.IsVisible() } @@ -99,13 +99,13 @@ func TestPathFlag_SatisfiesFlagInterface(t *testing.T) { } func TestPathFlag_SatisfiesRequiredFlagInterface(t *testing.T) { - var f cli.RequiredFlag = &cli.PathFlag{} + var f cli.Flag = &cli.PathFlag{} _ = f.IsRequired() } func TestPathFlag_SatisfiesVisibleFlagInterface(t *testing.T) { - var f cli.VisibleFlag = &cli.PathFlag{} + var f cli.Flag = &cli.PathFlag{} _ = f.IsVisible() } @@ -124,13 +124,13 @@ func TestStringSliceFlag_SatisfiesFlagInterface(t *testing.T) { } func TestStringSliceFlag_SatisfiesRequiredFlagInterface(t *testing.T) { - var f cli.RequiredFlag = &cli.StringSliceFlag{} + var f cli.Flag = &cli.StringSliceFlag{} _ = f.IsRequired() } func TestStringSliceFlag_SatisfiesVisibleFlagInterface(t *testing.T) { - var f cli.VisibleFlag = &cli.StringSliceFlag{} + var f cli.Flag = &cli.StringSliceFlag{} _ = f.IsVisible() } @@ -143,13 +143,13 @@ func TestTimestampFlag_SatisfiesFlagInterface(t *testing.T) { } func TestTimestampFlag_SatisfiesRequiredFlagInterface(t *testing.T) { - var f cli.RequiredFlag = &cli.TimestampFlag{} + var f cli.Flag = &cli.TimestampFlag{} _ = f.IsRequired() } func TestTimestampFlag_SatisfiesVisibleFlagInterface(t *testing.T) { - var f cli.VisibleFlag = &cli.TimestampFlag{} + var f cli.Flag = &cli.TimestampFlag{} _ = f.IsVisible() } @@ -168,13 +168,13 @@ func TestBoolFlag_SatisfiesFlagInterface(t *testing.T) { } func TestBoolFlag_SatisfiesRequiredFlagInterface(t *testing.T) { - var f cli.RequiredFlag = &cli.BoolFlag{} + var f cli.Flag = &cli.BoolFlag{} _ = f.IsRequired() } func TestBoolFlag_SatisfiesVisibleFlagInterface(t *testing.T) { - var f cli.VisibleFlag = &cli.BoolFlag{} + var f cli.Flag = &cli.BoolFlag{} _ = f.IsVisible() } @@ -193,13 +193,13 @@ func TestFloat64Flag_SatisfiesFlagInterface(t *testing.T) { } func TestFloat64Flag_SatisfiesRequiredFlagInterface(t *testing.T) { - var f cli.RequiredFlag = &cli.Float64Flag{} + var f cli.Flag = &cli.Float64Flag{} _ = f.IsRequired() } func TestFloat64Flag_SatisfiesVisibleFlagInterface(t *testing.T) { - var f cli.VisibleFlag = &cli.Float64Flag{} + var f cli.Flag = &cli.Float64Flag{} _ = f.IsVisible() } @@ -218,13 +218,13 @@ func TestIntFlag_SatisfiesFlagInterface(t *testing.T) { } func TestIntFlag_SatisfiesRequiredFlagInterface(t *testing.T) { - var f cli.RequiredFlag = &cli.IntFlag{} + var f cli.Flag = &cli.IntFlag{} _ = f.IsRequired() } func TestIntFlag_SatisfiesVisibleFlagInterface(t *testing.T) { - var f cli.VisibleFlag = &cli.IntFlag{} + var f cli.Flag = &cli.IntFlag{} _ = f.IsVisible() } @@ -243,13 +243,13 @@ func TestInt64Flag_SatisfiesFlagInterface(t *testing.T) { } func TestInt64Flag_SatisfiesRequiredFlagInterface(t *testing.T) { - var f cli.RequiredFlag = &cli.Int64Flag{} + var f cli.Flag = &cli.Int64Flag{} _ = f.IsRequired() } func TestInt64Flag_SatisfiesVisibleFlagInterface(t *testing.T) { - var f cli.VisibleFlag = &cli.Int64Flag{} + var f cli.Flag = &cli.Int64Flag{} _ = f.IsVisible() } @@ -268,13 +268,13 @@ func TestStringFlag_SatisfiesFlagInterface(t *testing.T) { } func TestStringFlag_SatisfiesRequiredFlagInterface(t *testing.T) { - var f cli.RequiredFlag = &cli.StringFlag{} + var f cli.Flag = &cli.StringFlag{} _ = f.IsRequired() } func TestStringFlag_SatisfiesVisibleFlagInterface(t *testing.T) { - var f cli.VisibleFlag = &cli.StringFlag{} + var f cli.Flag = &cli.StringFlag{} _ = f.IsVisible() } @@ -293,13 +293,13 @@ func TestDurationFlag_SatisfiesFlagInterface(t *testing.T) { } func TestDurationFlag_SatisfiesRequiredFlagInterface(t *testing.T) { - var f cli.RequiredFlag = &cli.DurationFlag{} + var f cli.Flag = &cli.DurationFlag{} _ = f.IsRequired() } func TestDurationFlag_SatisfiesVisibleFlagInterface(t *testing.T) { - var f cli.VisibleFlag = &cli.DurationFlag{} + var f cli.Flag = &cli.DurationFlag{} _ = f.IsVisible() } @@ -318,13 +318,13 @@ func TestUintFlag_SatisfiesFlagInterface(t *testing.T) { } func TestUintFlag_SatisfiesRequiredFlagInterface(t *testing.T) { - var f cli.RequiredFlag = &cli.UintFlag{} + var f cli.Flag = &cli.UintFlag{} _ = f.IsRequired() } func TestUintFlag_SatisfiesVisibleFlagInterface(t *testing.T) { - var f cli.VisibleFlag = &cli.UintFlag{} + var f cli.Flag = &cli.UintFlag{} _ = f.IsVisible() } @@ -343,13 +343,13 @@ func TestUint64Flag_SatisfiesFlagInterface(t *testing.T) { } func TestUint64Flag_SatisfiesRequiredFlagInterface(t *testing.T) { - var f cli.RequiredFlag = &cli.Uint64Flag{} + var f cli.Flag = &cli.Uint64Flag{} _ = f.IsRequired() } func TestUint64Flag_SatisfiesVisibleFlagInterface(t *testing.T) { - var f cli.VisibleFlag = &cli.Uint64Flag{} + var f cli.Flag = &cli.Uint64Flag{} _ = f.IsVisible() } From 069c6bfe4af0c2ecbfbb2916b104c4fbab931c47 Mon Sep 17 00:00:00 2001 From: Naveen Gogineni Date: Mon, 5 Sep 2022 08:12:38 -0400 Subject: [PATCH 3/4] Run gofmt --- flag.go | 15 +++++++++++++++ flag_test.go | 14 +++++++------- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/flag.go b/flag.go index a5434cbd98..a0b9834711 100644 --- a/flag.go +++ b/flag.go @@ -89,22 +89,37 @@ func (f FlagsByName) Swap(i, j int) { // this interface be implemented. type Flag interface { fmt.Stringer + // Apply Flag settings to the given flag set Apply(*flag.FlagSet) error + + // All possible names for this flag Names() []string + + // Whether the flag has been set or not IsSet() bool + + // whether the flag is a required flag or not IsRequired() bool + // IsVisible returns true if the flag is not hidden, otherwise false IsVisible() bool + + // Returns the category of the flag GetCategory() string + // GetUsage returns the usage string for the flag GetUsage() string + // GetEnvVars returns the env vars for this flag GetEnvVars() []string + // TakesValue returns true if the flag takes a value, otherwise false TakesValue() bool + // GetDefaultText returns the default text for this flag GetDefaultText() string + // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. GetValue() string diff --git a/flag_test.go b/flag_test.go index 9e50526218..deac525b49 100644 --- a/flag_test.go +++ b/flag_test.go @@ -2384,43 +2384,43 @@ func TestFlagDefaultValue(t *testing.T) { name: "stringSclice", flag: &StringSliceFlag{Name: "flag", Value: NewStringSlice("default1", "default2")}, toParse: []string{"--flag", "parsed"}, - expect: `--flag value (default: "default1", "default2") (accepts multiple inputs)`, + expect: `--flag value (default: "default1", "default2") (accepts multiple inputs)`, }, { name: "float64Sclice", flag: &Float64SliceFlag{Name: "flag", Value: NewFloat64Slice(1.1, 2.2)}, toParse: []string{"--flag", "13.3"}, - expect: `--flag value (default: 1.1, 2.2) (accepts multiple inputs)`, + expect: `--flag value (default: 1.1, 2.2) (accepts multiple inputs)`, }, { name: "int64Sclice", flag: &Int64SliceFlag{Name: "flag", Value: NewInt64Slice(1, 2)}, toParse: []string{"--flag", "13"}, - expect: `--flag value (default: 1, 2) (accepts multiple inputs)`, + expect: `--flag value (default: 1, 2) (accepts multiple inputs)`, }, { name: "intSclice", flag: &IntSliceFlag{Name: "flag", Value: NewIntSlice(1, 2)}, toParse: []string{"--flag", "13"}, - expect: `--flag value (default: 1, 2) (accepts multiple inputs)`, + expect: `--flag value (default: 1, 2) (accepts multiple inputs)`, }, { name: "string", flag: &StringFlag{Name: "flag", Value: "default"}, toParse: []string{"--flag", "parsed"}, - expect: `--flag value (default: "default")`, + expect: `--flag value (default: "default")`, }, { name: "bool", flag: &BoolFlag{Name: "flag", Value: true}, toParse: []string{"--flag", "false"}, - expect: `--flag (default: true)`, + expect: `--flag (default: true)`, }, { name: "uint64", flag: &Uint64Flag{Name: "flag", Value: 1}, toParse: []string{"--flag", "13"}, - expect: `--flag value (default: 1)`, + expect: `--flag value (default: 1)`, }, } for i, v := range cases { From 7e80d2099c32ba3024a313e0890ddf85f0b2463f Mon Sep 17 00:00:00 2001 From: Naveen Gogineni Date: Mon, 5 Sep 2022 08:17:26 -0400 Subject: [PATCH 4/4] Update godoc --- godoc-current.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/godoc-current.txt b/godoc-current.txt index 79b4245570..c35428ebc1 100644 --- a/godoc-current.txt +++ b/godoc-current.txt @@ -786,22 +786,37 @@ type ExitErrHandlerFunc func(cCtx *Context, err error) type Flag interface { fmt.Stringer + // Apply Flag settings to the given flag set Apply(*flag.FlagSet) error + + // All possible names for this flag Names() []string + + // Whether the flag has been set or not IsSet() bool + + // whether the flag is a required flag or not IsRequired() bool + // IsVisible returns true if the flag is not hidden, otherwise false IsVisible() bool + + // Returns the category of the flag GetCategory() string + // GetUsage returns the usage string for the flag GetUsage() string + // GetEnvVars returns the env vars for this flag GetEnvVars() []string + // TakesValue returns true if the flag takes a value, otherwise false TakesValue() bool + // GetDefaultText returns the default text for this flag GetDefaultText() string + // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. GetValue() string