From d4cc703210ff08d7bc4f73bfbec1e51eda29a5a4 Mon Sep 17 00:00:00 2001 From: "Wlazlo, Matt" Date: Fri, 13 Apr 2018 14:46:24 +1000 Subject: Custom parsers implementing encoding.TextMarshaler() can have default values printed via --help --- README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'README.md') diff --git a/README.md b/README.md index 18dc556..f3d1bfc 100644 --- a/README.md +++ b/README.md @@ -265,15 +265,33 @@ func (n *NameDotName) UnmarshalText(b []byte) error { return nil } +// optional, implement in case you want to use defaults +func (n *NameDotName) MarshalText() (text []byte, err error) { + text = []byte(fmt.Sprintf("%s.%s", n.Head, n.Tail)) + return +} + func main() { var args struct { Name *NameDotName } + // set default + args.Name = &NameDotName{"file", "txt"} arg.MustParse(&args) fmt.Printf("%#v\n", args.Name) } ``` ```shell +$ ./example --help +Usage: test [--name NAME] + +Options: + --name NAME [default: file.txt] + --help, -h display this help and exit + +$ ./example +&main.NameDotName{Head:"file", Tail:"txt"} + $ ./example --name=foo.bar &main.NameDotName{Head:"foo", Tail:"bar"} -- cgit v1.2.3 From 51337ded775c91dc26574d7d2dc2e493cf416138 Mon Sep 17 00:00:00 2001 From: "Wlazlo, Matt" Date: Mon, 16 Apr 2018 11:07:48 +1000 Subject: fixed example comment, test coverage issue --- README.md | 2 +- usage_test.go | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) (limited to 'README.md') diff --git a/README.md b/README.md index f3d1bfc..e8b62a4 100644 --- a/README.md +++ b/README.md @@ -265,7 +265,7 @@ func (n *NameDotName) UnmarshalText(b []byte) error { return nil } -// optional, implement in case you want to use defaults +// optional: implement in case you want to display a default value in the usage string func (n *NameDotName) MarshalText() (text []byte, err error) { text = []byte(fmt.Sprintf("%s.%s", n.Head, n.Tail)) return diff --git a/usage_test.go b/usage_test.go index 4aa2f24..4f179f0 100644 --- a/usage_test.go +++ b/usage_test.go @@ -9,6 +9,7 @@ import ( "github.com/stretchr/testify/require" "strings" "fmt" + "errors" ) type NameDotName struct { @@ -85,6 +86,42 @@ Options: assert.Equal(t, expectedHelp, help.String()) } +type MyEnum int + +func (n *MyEnum) UnmarshalText(b []byte) error { + b = []byte("Hello") + return nil +} + +func (n *MyEnum) MarshalText() (text []byte, err error) { + s := "There was a problem" + text = []byte(s) + err = errors.New(s) + return +} + +func TestUsageError(t *testing.T) { + expectedHelp := `Usage: example [--name NAME] + +Options: + --name NAME [default: error: There was a problem] + --help, -h display this help and exit +` + var args struct { + Name *MyEnum + } + v := MyEnum(42) + args.Name = &v + p, err := NewParser(Config{"example"}, &args) + + // NB: some might might expect there to be an error here + require.NoError(t, err) + + var help bytes.Buffer + p.WriteHelp(&help) + assert.Equal(t, expectedHelp, help.String()) +} + func TestUsageLongPositionalWithHelp_legacyForm(t *testing.T) { expectedHelp := `Usage: example VERYLONGPOSITIONALWITHHELP -- cgit v1.2.3