summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Flint <[email protected]>2024-04-02 12:16:06 -0400
committerGitHub <[email protected]>2024-04-02 12:16:06 -0400
commitdfca71d1594a749ef5e2203e84cfb5a1b8e9387b (patch)
treeca10ce099d08b010cd3b7def62f30afdfcf07d10
parent188bd31bf60d57a7196c7547dd4bcd73298637ea (diff)
parentbe792f1f8b2f3971c54e00240ea35a53512ec7bf (diff)
Merge pull request #243 from alexflint/handle-empty-placeholderv1.5.0
Handle explicit empty placeholders
-rw-r--r--parse.go8
-rw-r--r--usage.go5
-rw-r--r--usage_test.go29
3 files changed, 37 insertions, 5 deletions
diff --git a/parse.go b/parse.go
index 45e4751..251b005 100644
--- a/parse.go
+++ b/parse.go
@@ -56,7 +56,7 @@ type spec struct {
env string // the name of the environment variable for this option, or empty for none
defaultValue reflect.Value // default value for this option
defaultString string // default value for this option, in string form to be displayed in help text
- placeholder string // name of the data in help
+ placeholder string // placeholder string in help
}
// command represents a named subcommand, or the top-level command
@@ -335,9 +335,8 @@ func cmdFromStruct(name string, dest path, t reflect.Type) (*command, error) {
spec.help = help
}
- // Look at the tag
- var isSubcommand bool // tracks whether this field is a subcommand
-
+ // process each comma-separated part of the tag
+ var isSubcommand bool
for _, key := range strings.Split(tag, ",") {
if key == "" {
continue
@@ -407,6 +406,7 @@ func cmdFromStruct(name string, dest path, t reflect.Type) (*command, error) {
}
}
+ // placeholder is the string used in the help text like this: "--somearg PLACEHOLDER"
placeholder, hasPlaceholder := field.Tag.Lookup("placeholder")
if hasPlaceholder {
spec.placeholder = placeholder
diff --git a/usage.go b/usage.go
index 0c68ee7..6b578a5 100644
--- a/usage.go
+++ b/usage.go
@@ -328,7 +328,10 @@ func (p *Parser) printEnvOnlyVar(w io.Writer, spec *spec) {
}
func synopsis(spec *spec, form string) string {
- if spec.cardinality == zero {
+ // if the user omits the placeholder tag then we pick one automatically,
+ // but if the user explicitly specifies an empty placeholder then we
+ // leave out the placeholder in the help message
+ if spec.cardinality == zero || spec.placeholder == "" {
return form
}
return form + " " + spec.placeholder
diff --git a/usage_test.go b/usage_test.go
index 612d573..b2bcab1 100644
--- a/usage_test.go
+++ b/usage_test.go
@@ -601,6 +601,35 @@ Options:
assert.Equal(t, expectedUsage, strings.TrimSpace(usage.String()))
}
+func TestUsageWithEmptyPlaceholder(t *testing.T) {
+ expectedUsage := "Usage: example [-a] [--b] [--c]"
+
+ expectedHelp := `
+Usage: example [-a] [--b] [--c]
+
+Options:
+ -a some help for a
+ --b some help for b
+ --c, -c some help for c
+ --help, -h display this help and exit
+`
+ var args struct {
+ ShortOnly string `arg:"-a,--" placeholder:"" help:"some help for a"`
+ LongOnly string `arg:"--b" placeholder:"" help:"some help for b"`
+ Both string `arg:"-c,--c" placeholder:"" help:"some help for c"`
+ }
+ p, err := NewParser(Config{Program: "example"}, &args)
+ require.NoError(t, err)
+
+ var help bytes.Buffer
+ p.WriteHelp(&help)
+ assert.Equal(t, expectedHelp[1:], help.String())
+
+ var usage bytes.Buffer
+ p.WriteUsage(&usage)
+ assert.Equal(t, expectedUsage, strings.TrimSpace(usage.String()))
+}
+
func TestUsageWithShortFirst(t *testing.T) {
expectedUsage := "Usage: example [-c CAT] [--dog DOG]"