From ff8f5ee053b91222794e5246fcdab5a12fc3b79b Mon Sep 17 00:00:00 2001 From: Adrien Joly <531781+adrienjoly@users.noreply.github.com> Date: Fri, 18 Dec 2020 10:21:49 +0100 Subject: [PATCH 1/2] Make examples executable directly Hi! Thanks for writing and sharing this useful args parsing library! As I'm still learning Go, it took me some time to make the provided examples work. I propose the apply in README.md the changes I had to make in order to make them work on my end, hoping that it would also help other potential users of your module. Best regards, Adrien --- README.md | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 0e9a982..42008c3 100644 --- a/README.md +++ b/README.md @@ -58,9 +58,13 @@ Documentation can be found at [Godoc](https://godoc.org/github.com/cosiner/flag) # Example ## Flags ```Go -package flag +package main -import "fmt" +import ( + "fmt" + + flag "github.com/cosiner/flag" +) type Tar struct { GZ bool `names:"-z, --gz" usage:"gzip format"` @@ -73,7 +77,7 @@ type Tar struct { SourceFiles []string `args:"true"` } -func (t *Tar) Metadata() map[string]Flag { +func (t *Tar) Metadata() map[string]flag.Flag { const ( usage = "tar is a tool for manipulate tape archives." version = ` @@ -87,7 +91,7 @@ func (t *Tar) Metadata() map[string]Flag { cpio, ar, and shar archives. ` ) - return map[string]Flag{ + return map[string]flag.Flag{ "": { Usage: usage, Version: version, @@ -99,22 +103,21 @@ func (t *Tar) Metadata() map[string]Flag { } } -func ExampleFlagSet_ParseStruct() { +func main() { var tar Tar - NewFlagSet(Flag{}).ParseStruct(&tar, "tar", "-zcf", "a.tgz", "a.go", "b.go") + flag.NewFlagSet(flag.Flag{}).ParseStruct(&tar, os.Args...) fmt.Println(tar.GZ) fmt.Println(tar.Create) fmt.Println(tar.File) fmt.Println(tar.SourceFiles) - // Output: + // Output for `$ go build -o "tar" . && ./tar -zcf a.tgz a.go b.go`: // true // true // a.tgz // [a.go b.go] } - ``` ## Help message ``` @@ -146,6 +149,13 @@ Flags: ## FlagSet ```Go +package main + +import ( + "fmt" + + flag "github.com/cosiner/flag" +) type GoCmd struct { Build struct { @@ -177,8 +187,8 @@ type GoCmd struct { } `usage:"run gofmt on package sources"` } -func (*GoCmd) Metadata() map[string]Flag { - return map[string]Flag{ +func (*GoCmd) Metadata() map[string]flag.Flag { + return map[string]flag.Flag{ "": { Usage: "Go is a tool for managing Go source code.", Arglist: "command [argument]", @@ -196,10 +206,10 @@ func (*GoCmd) Metadata() map[string]Flag { } } -func TestSubset(t *testing.T) { +func main() { var g GoCmd - set := NewFlagSet(Flag{}) + set := flag.NewFlagSet(flag.Flag{}) set.StructFlags(&g) set.Help(false) fmt.Println() From 254979606a6f05af531d65741c663315a6cd3b4d Mon Sep 17 00:00:00 2001 From: Adrien Joly <531781+adrienjoly@users.noreply.github.com> Date: Fri, 18 Dec 2020 10:42:32 +0100 Subject: [PATCH 2/2] update second example to automatically display help when command and/or parameters are incomplete --- README.md | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 42008c3..d83d255 100644 --- a/README.md +++ b/README.md @@ -157,6 +157,7 @@ import ( flag "github.com/cosiner/flag" ) + type GoCmd struct { Build struct { Enable bool @@ -170,21 +171,6 @@ type GoCmd struct { Clean struct { Enable bool } `usage:"remove object files"` - Doc struct { - Enable bool - } `usage:"show documentation for package or symbol"` - Env struct { - Enable bool - } `usage:"print Go environment information"` - Bug struct { - Enable bool - } `usage:"start a bug report"` - Fix struct { - Enable bool - } `usage:"run go tool fix on packages"` - Fmt struct { - Enable bool - } `usage:"run gofmt on package sources"` } func (*GoCmd) Metadata() map[string]flag.Flag { @@ -210,12 +196,27 @@ func main() { var g GoCmd set := flag.NewFlagSet(flag.Flag{}) - set.StructFlags(&g) - set.Help(false) - fmt.Println() - build, _ := set.FindSubset("build") - build.Help(false) + set.ParseStruct(&g, os.Args...) + + if g.Build.Enable { + if len(g.Build.Packages) == 0 { + fmt.Fprintln(os.Stderr, "Error: you should at least specify one package") + fmt.Println("") + build, _ := set.FindSubset("build") + build.Help(false) // display usage information for the "go build" command only + } else { + fmt.Println("Going to build with the following parameters:") + fmt.Println(g.Build) + } + } else if g.Clean.Enable { + fmt.Println("Going to clean with the following parameters:") + fmt.Println(g.Clean) + } else { + set.Help(false) // display usage information, with list of supported commands + } } + +// Test with `$ go build -o "go" . && ./go --help` ``` ##Help Message ```