diff --git a/README.md b/README.md index 0e9a982..d83d255 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,14 @@ Flags: ## FlagSet ```Go +package main + +import ( + "fmt" + + flag "github.com/cosiner/flag" +) + type GoCmd struct { Build struct { @@ -160,25 +171,10 @@ 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 { - 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,16 +192,31 @@ func (*GoCmd) Metadata() map[string]Flag { } } -func TestSubset(t *testing.T) { +func main() { var g GoCmd - set := NewFlagSet(Flag{}) - set.StructFlags(&g) - set.Help(false) - fmt.Println() - build, _ := set.FindSubset("build") - build.Help(false) + set := flag.NewFlagSet(flag.Flag{}) + 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 ```