Format help placeholders with slice/map separators
Use the specified separators for a flag in the placeholders printed in the help message for slices and maps. Do not print the separator and ellipsis if the separator is disabled (`"none"`). Previously the default separator was printed with an ellipsis, ignoring the `sep` and `mapsep` tags. Add tests for `Flag.FormatPlaceHolder()`.
This commit is contained in:
committed by
Alec Thomas
parent
b89354adb0
commit
f19f1031c0
@@ -372,8 +372,8 @@ func (f *Flag) String() string {
|
|||||||
// FormatPlaceHolder formats the placeholder string for a Flag.
|
// FormatPlaceHolder formats the placeholder string for a Flag.
|
||||||
func (f *Flag) FormatPlaceHolder() string {
|
func (f *Flag) FormatPlaceHolder() string {
|
||||||
tail := ""
|
tail := ""
|
||||||
if f.Value.IsSlice() {
|
if f.Value.IsSlice() && f.Value.Tag.Sep != -1 {
|
||||||
tail += ",..."
|
tail += string(f.Value.Tag.Sep) + "..."
|
||||||
}
|
}
|
||||||
if f.Default != "" {
|
if f.Default != "" {
|
||||||
if f.Value.Target.Kind() == reflect.String {
|
if f.Value.Target.Kind() == reflect.String {
|
||||||
@@ -385,7 +385,10 @@ func (f *Flag) FormatPlaceHolder() string {
|
|||||||
return f.PlaceHolder + tail
|
return f.PlaceHolder + tail
|
||||||
}
|
}
|
||||||
if f.Value.IsMap() {
|
if f.Value.IsMap() {
|
||||||
return "KEY=VALUE;..."
|
if f.Value.Tag.MapSep != -1 {
|
||||||
|
tail = string(f.Value.Tag.MapSep) + "..."
|
||||||
|
}
|
||||||
|
return "KEY=VALUE" + tail
|
||||||
}
|
}
|
||||||
return strings.ToUpper(f.Name) + tail
|
return strings.ToUpper(f.Name) + tail
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,3 +25,44 @@ func TestModelApplicationCommands(t *testing.T) {
|
|||||||
}
|
}
|
||||||
require.Equal(t, []string{"one two", "one three <four>"}, actual)
|
require.Equal(t, []string{"one two", "one three <four>"}, actual)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestFormatPlaceHolder(t *testing.T) {
|
||||||
|
var cli struct {
|
||||||
|
String string
|
||||||
|
DefaultInt int `default:"42"`
|
||||||
|
DefaultStr string `default:"hello"`
|
||||||
|
Placeholder string `placeholder:"world"`
|
||||||
|
SliceSep []string
|
||||||
|
SliceNoSep []string `sep:"none"`
|
||||||
|
SliceDefault []string `default:"hello"`
|
||||||
|
SlicePlaceholder []string `placeholder:"world"`
|
||||||
|
SliceDefaultPlaceholder []string `default:"hello" placeholder:"world"`
|
||||||
|
MapSep map[string]string
|
||||||
|
MapNoSep map[string]string `mapsep:"none"`
|
||||||
|
MapDefault map[string]string `mapsep:"none" default:"hello"`
|
||||||
|
MapPlaceholder map[string]string `mapsep:"none" placeholder:"world"`
|
||||||
|
}
|
||||||
|
tests := map[string]string{
|
||||||
|
"help": "HELP",
|
||||||
|
"string": "STRING",
|
||||||
|
"default-int": "42",
|
||||||
|
"default-str": `"hello"`,
|
||||||
|
"placeholder": "world",
|
||||||
|
"slice-sep": "SLICE-SEP,...",
|
||||||
|
"slice-no-sep": "SLICE-NO-SEP",
|
||||||
|
"slice-default": "hello,...",
|
||||||
|
"slice-placeholder": "world,...",
|
||||||
|
"slice-default-placeholder": "hello,...",
|
||||||
|
"map-sep": "KEY=VALUE;...",
|
||||||
|
"map-no-sep": "KEY=VALUE",
|
||||||
|
"map-default": "hello",
|
||||||
|
"map-placeholder": "world",
|
||||||
|
}
|
||||||
|
|
||||||
|
p := mustNew(t, &cli)
|
||||||
|
for _, flag := range p.Model.Flags {
|
||||||
|
want, ok := tests[flag.Name]
|
||||||
|
require.Truef(t, ok, "unknown flag name: %s", flag.Name)
|
||||||
|
require.Equal(t, want, flag.FormatPlaceHolder())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user