From bf156d17a378826a4832340c79f07aab30578fa8 Mon Sep 17 00:00:00 2001 From: Hugo Hromic Date: Mon, 22 Jul 2024 19:18:14 +0100 Subject: [PATCH] Fix help text for positional args with default and env var --- usage.go | 2 +- usage_test.go | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/usage.go b/usage.go index 66a5be9..8a7c139 100644 --- a/usage.go +++ b/usage.go @@ -260,7 +260,7 @@ func (p *Parser) WriteHelpForSubcommand(w io.Writer, subcommand ...string) error if len(positionals) > 0 { fmt.Fprint(w, "\nPositional arguments:\n") for _, spec := range positionals { - print(w, spec.placeholder, spec.help) + print(w, spec.placeholder, spec.help, withDefault(spec.defaultString), withEnv(spec.env)) } } diff --git a/usage_test.go b/usage_test.go index a958abb..fa9ace3 100644 --- a/usage_test.go +++ b/usage_test.go @@ -1015,3 +1015,72 @@ Commands: p.WriteHelp(&help) assert.Equal(t, expectedHelp[1:], help.String()) } + +func TestHelpShowsPositionalWithDefault(t *testing.T) { + expectedHelp := ` +Usage: example [FOO] + +Positional arguments: + FOO this is a positional with a default [default: bar] + +Options: + --help, -h display this help and exit +` + + var args struct { + Foo string `arg:"positional" default:"bar" help:"this is a positional with a default"` + } + + 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()) +} + +func TestHelpShowsPositionalWithEnv(t *testing.T) { + expectedHelp := ` +Usage: example [FOO] + +Positional arguments: + FOO this is a positional with an env variable [env: FOO] + +Options: + --help, -h display this help and exit +` + + var args struct { + Foo string `arg:"positional,env:FOO" help:"this is a positional with an env variable"` + } + + 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()) +} + +func TestHelpShowsPositionalWithDefaultAndEnv(t *testing.T) { + expectedHelp := ` +Usage: example [FOO] + +Positional arguments: + FOO this is a positional with a default and an env variable [default: bar, env: FOO] + +Options: + --help, -h display this help and exit +` + + var args struct { + Foo string `arg:"positional,env:FOO" default:"bar" help:"this is a positional with a default and an env variable"` + } + + 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()) +}