import "github.com/dc0d/clarg"
Package clarg provides simple Sub-Commands for Go using flag package - can be used via copy/paste too, because it's small and it's just some functions!
Parse parses arguments for list of commands. The first command is the default command (top level args) and can be nil. Non-Flag args are available via matched FlagSet's Args() method.
Code:
topFlags := flag.NewFlagSet("", flag.ExitOnError)
cmdListFlags := flag.NewFlagSet("list", flag.ExitOnError)
cmdSendFlags := flag.NewFlagSet("send", flag.ExitOnError)
var cmdDefault struct {
count int
data string
}
var cmdList struct {
age int
name string
}
var cmdSend struct {
dst string
payload string
}
topFlags.IntVar(&cmdDefault.count, "cnt", 0, "-cnt <count>")
topFlags.StringVar(&cmdDefault.data, "data", "", "-data <data string>")
cmdListFlags.IntVar(&cmdList.age, "age", -1, "-age <age>")
cmdListFlags.StringVar(&cmdList.name, "name", "", "-name <name>")
cmdSendFlags.StringVar(&cmdSend.dst, "dst", "", "-dst <destination>")
cmdSendFlags.StringVar(&cmdSend.payload, "p", "", "-p <payload>")
if cmd, err := Parse(topFlags,
cmdListFlags,
cmdSendFlags); err != nil {
// show/handle error
} else {
_ = cmd // the matched *flag.FlagSet
}
// use values of back fields for flags
Code:
topFlags := flag.NewFlagSet("", flag.ExitOnError)
var cmdDefault struct {
count int
data string
}
topFlags.IntVar(&cmdDefault.count, "cnt", 0, "-cnt <count>")
topFlags.StringVar(&cmdDefault.data, "data", "", "-data <data string>")
if cmd, err := Parse(topFlags); err != nil {
// show/handle error
} else {
fromenv := func(set *flag.FlagSet, flagName, envName string) error {
f := set.Lookup(flagName)
if f == nil {
return nil
}
if f.Value.String() != f.DefValue {
return nil
}
e := os.Getenv(envName)
if e == "" {
return nil
}
if e == f.DefValue {
return nil
}
return f.Value.Set(e)
}
topFlags.VisitAll(func(f *flag.Flag) {
// sample env var name convention: APPNAME_FLAGNAME
if err := fromenv(topFlags,
f.Name,
strings.ToUpper(filepath.Base(os.Args[0])+"_"+f.Name)); err != nil {
log.Fatal(err)
}
})
_ = cmd // the matched *flag.FlagSet
}
// use values of back fields for flags
Code:
topFlags := flag.NewFlagSet("", flag.ExitOnError)
var cmdDefault struct {
count int
data string
}
topFlags.IntVar(&cmdDefault.count, "cnt", 0, "-cnt <count>")
topFlags.StringVar(&cmdDefault.data, "data", "", "-data <data string>")
if cmd, err := Parse(topFlags); err != nil {
// show/handle error
} else {
nonFlags := topFlags.Args()
_ = cmd // the matched *flag.FlagSet
_ = nonFlags
}
// use values of back fields for flags
Package clarg imports 3 packages (graph). Updated 2018-02-21. Refresh now. Tools for package owners.