cargs
A simple but powerful Go package to parse command line arguments getopt(3) style. Designed especially for making CLI based libraries with ease.
Installation
$ go get "github.com/thatisuday/cargs"
Usage
// cmd.go
package main
import "github.com/thatisuday/cargs"
func main() {
// create new registry
registry := cargs.NewRegistry()
// register the root command
registry.
Register("").
AddArg("output").
AddFlag("force", "f", true, "").
AddFlag("verbose", "v", true, "").
AddFlag("version", "V", false, "").
AddFlag("dir", "", false, "/var/users")
// register the `info` command
registry.
Register("info").
AddArg("username").
AddArg("category").
AddFlag("verbose", "v", true, "").
AddFlag("version", "V", false, "1.0.1").
AddFlag("output", "o", false, "./")
// register the `ghost` command
registry.
Register("ghost")
// parse command line arguments
carg, err := registry.Parse(os.Args[1:])
// check for error
if err != nil {
fmt.Printf("Error => %#v\n", err)
return
}
// get executed command name
fmt.Printf("Command Name => %#v\n", carg.Cmd)
// get argument values
for _, v := range carg.Args {
fmt.Printf("Arg => %#v\n", v)
}
// get flag values
for _, v := range carg.Flags {
fmt.Printf("Flag => %#v\n", v)
}
}
In the above example, we have registred a root command and an info
command. The registry
can parse arguments passed to the command that executed this program.
Example 1
$ go run cmd.go
Command Name => ""
Arg => &cargs.Arg{Name:"output", Value:""}
Flag => &cargs.Flag{Name:"version", ShortName:"V", IsBoolean:true, DefaultValue:"false", Value:""}
Flag => &cargs.Flag{Name:"dir", ShortName:"", IsBoolean:false, DefaultValue:"/var/users", Value:""}
Flag => &cargs.Flag{Name:"force", ShortName:"f", IsBoolean:true, DefaultValue:"false", Value:""}
Flag => &cargs.Flag{Name:"verbose", ShortName:"v", IsBoolean:true, DefaultValue:"false", Value:""}
Example 2
$ go run cmd.go userinfo -V 1.0.1 -v --force --dir ./sub/dir
$ go run cmd.go -V 1.0.1 -v --force userinfo --dir ./sub/dir
$ go run cmd.go -V 1.0.1 -v --force --dir ./sub/dir userinfo
$ go run cmd.go -V 1.0.1 -v --force -dir ./sub/dir userinfo
Command Name => ""
Arg => &cargs.Arg{Name:"output", Value:"userinfo"}
Flag => &cargs.Flag{Name:"verbose", ShortName:"v", IsBoolean:true, DefaultValue:"false", Value:"true"}
Flag => &cargs.Flag{Name:"version", ShortName:"V", IsBoolean:false, DefaultValue:"", Value:"1.0.1"}
Flag => &cargs.Flag{Name:"dir", ShortName:"", IsBoolean:false, DefaultValue:"/var/users", Value:"./sub/dir"}
Flag => &cargs.Flag{Name:"force", ShortName:"f", IsBoolean:true, DefaultValue:"false", Value:"true"}
Example 3
$ go run cmd.go userinfo -V 1.0.1 -v --force -d ./sub/dir
Error => cargs.ErrorUnknownFlag{Name:"d", IsShort:true}
$ go run cmd.go userinfo -V 1.0.1 -v --force --d ./sub/dir
Error => cargs.ErrorUnknownFlag{Name:"d", IsShort:false}
$ go run cmd.go userinfo -V 1.0.1 -v --force -di ./sub/dir
Error => cargs.ErrorUnknownFlag{Name:"di", IsShort:false}
$ go run cmd.go userinfo -V 1.0.1 -v --force --directory ./sub/dir
Error => cargs.ErrorUnknownFlag{Name:"directory", IsShort:false}
$ go run cmd.go userinfo -V 1.0.1 -v --force -directory ./sub/dir
Error => cargs.ErrorUnknownFlag{Name:"directory", IsShort:false}
Example 4
$ go run cmd.go information --force
Command Name => ""
Arg => &cargs.Arg{Name:"output", Value:"information"}
Flag => &cargs.Flag{Name:"force", ShortName:"f", IsBoolean:true, DefaultValue:"false", Value:"true"}
Flag => &cargs.Flag{Name:"verbose", ShortName:"v", IsBoolean:true, DefaultValue:"false", Value:""}
Flag => &cargs.Flag{Name:"version", ShortName:"V", IsBoolean:false, DefaultValue:"", Value:""}
Flag => &cargs.Flag{Name:"dir", ShortName:"", IsBoolean:false, DefaultValue:"/var/users", Value:""}
Example 5
$ go run cmd.go info thatisuday teachers -V -v --output ./opt/dir extra
Command Name => "info"
Arg => &cargs.Arg{Name:"username", Value:"thatisuday"}
Arg => &cargs.Arg{Name:"category", Value:"teachers"}
Flag => &cargs.Flag{Name:"verbose", ShortName:"v", IsBoolean:true, DefaultValue:"false", Value:"true"}
Flag => &cargs.Flag{Name:"version", ShortName:"V", IsBoolean:false, DefaultValue:"1.0.1", Value:""}
Flag => &cargs.Flag{Name:"output", ShortName:"o", IsBoolean:false, DefaultValue:"./", Value:"./opt/dir"}
Example 6
$ go run cmd.go info -v thatisuday -V 2.0.0 teachers extra
$ go run cmd.go info thatisuday -v -V 2.0.0 teachers extra
$ go run cmd.go info thatisuday teachers extra -v -V 2.0.0
Command Name => "info"
Arg => &cargs.Arg{Name:"username", Value:"thatisuday"}
Arg => &cargs.Arg{Name:"category", Value:"teachers"}
Flag => &cargs.Flag{Name:"verbose", ShortName:"v", IsBoolean:true, DefaultValue:"false", Value:"true"}
Flag => &cargs.Flag{Name:"version", ShortName:"V", IsBoolean:false, DefaultValue:"1.0.1", Value:"2.0.0"}
Flag => &cargs.Flag{Name:"output", ShortName:"o", IsBoolean:false, DefaultValue:"./", Value:""}
Example 7
$ go run cmd.go ghost -v thatisuday -V 2.0.0 teachers extra
Error => cargs.ErrorUnknownFlag{Name:"v", IsShort:true}
Example 8
$ go run cmd.go ghost
$ go run cmd.go ghost thatisuday extra
Command Name => "ghost
Contribution
I am looking for some contributors for writing better test cases and documentation.