- Notifications
You must be signed in to change notification settings - Fork6
License
go-clix/cli
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Cli-X is a command line library for Go, inspired byspf13/cobra
.
- 📦
struct
based API: Similar tocobra
,go-clix/cli
features astruct
basedAPI for easy composition and discovery of available options. - 🚸Subcommands:
cli.Command
can be nested for agit
like experience. - 📌Flags: Every command has it's own set of flags. POSIX compliantusing
spf13/pflag
. - 👥Aliases: Commands can have multiple names, sobreaking changes can easily be mitigated.
- 🎯Go based completion:
<TAB>
completion is supported forbash
,zsh
andfish
. But you can generate suggestions usingGo code!
Add the library to your project:
$ go get github.com/go-clix/cli
Then set up your root command:
package mainimport ("fmt""github.com/go-clix/cli")funcmain() {// create the root commandrootCmd:= cli.Command{Use:"greet",Short:"print a message",Run:func(cmd*cli.Command,args []string)error {fmt.Println("Hello from Cli-X!") }, }// run and check for errorsiferr:=rootCmd.Execute();err!=nil {fmt.Println(err)os.Exit(1) }}
Every command may have children:
// use a func to return a Command instead of// a global variable and `init()`funcapplyCmd()*cli.Command {cmd:=&cli.Command{Use:"apply",Short:"apply the changes" }cmd.Run=func(cmd*cli.Command,args []string)error {fmt.Println("applied",args[0]) }returncmd}funcmain() {rootCmd:=&cli.Comand{Use:"kubectl",Short:"Kubernetes management tool", }// add the child commandrootCmd.AddChildren(applyCmd(), )// run and check for errorsiferr:=rootCmd.Execute();err!=nil {fmt.Println(err)os.Exit(1) }}
Note: Do not use the
init()
function for setting up your commands.Create constructors as shown above!
Apflag.FlagSet
can be accessed per command using*Command.Flags()
:
funcapplyCmd()*cli.Command {cmd:=&cli.Command{Use:"apply",Short:"apply the changes" }force:=cmd.Flags().BoolP("force","f",false,"skip checks")cmd.Run=func(cmd*cli.Command,args []string)error {fmt.Println("applied",args[0])if*force {fmt.Println("The force was with us.") } }returncmd}
To make theapply
subcommand also available asmake
anddo
:
funcapplyCmd()*cli.Command {cmd:=&cli.Command{Use:"apply",Aliases: []string{"make","do"},Short:"apply the changes" }}
Keep in mind that in--help
outputs the command will still be calledapply
.
Cli-X has a very powerful cli completion system, based onposener/complete
.
It is powerful, because suggestions come directly from the Go application, notfrom abash
script or similar.
Command and Flag names are automatically suggested, custom suggestions can beimplemented forpositional arguments andflagvalues:
Custom suggestions for flag values can be set up usingCommand.Predictors
.
To do so, you need to add acomplete.Predictor
for that flag. Cli-X has anumber of predefined ones:
PredictAny()
: Predicts available files and directories, likebash
does whenhaving no better ideaPredictNone()
: Predicts literally nothing. No suggestions will be shown.PredictSet(...string)
: Suggests from a predefined slice of options
If that's not sufficient, usePredictFunc(func(complete.Args) []string)
tocreate your own.
import ("github.com/posener/complete""github.com/go-clix/cli")funclogsCmd()*cli.Command {cmd:=&cli.Command{Use:"logs",Short:"show logs of a pod",Predictors:map[string]complete.Predictor{"output":cli.PredictSet("lines","json","logfmt"), }, }output:=cmd.Flags().StringP("output","o","lines","one of [lines, json, logfmt]")}
For positional arguments, Cli-X uses a slightly differentinterface
, to allowvalidation as well:
interface {Validate(args []string)errorPredict(Args) []string}
Predefined options are also available:
ArgsAny()
: accepts any number args, predicts files and directoriesArgsExact(n)
: acceptsexactlyn
arguments. Predicts files and directories.ArgsRange(n, m)
: accepts betweenn
andm
arguments (inclusive). Predicts files and directories.ArgsNone()
: acceptsno args and predicts nothing.ArgsSet(...string)
: Acceptsone argument, which MUST be included in thegiven set. Predicts the values from the set.
import ("github.com/posener/complete""github.com/go-clix/cli")funcapplyCmd()*cli.Command {cmd:=&cli.Command{Use:"logs",Short:"show logs of a pod",// we expect one argument which can be anythingArgs:cli.ArgsExact(1), }}
About
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Contributors6
Uh oh!
There was an error while loading.Please reload this page.