Documentation
¶
Overview ¶
Package cli provides a minimal framework for creating and organizing command line Go programs. It is designed to be easy to understand and write.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Command ¶
type Command interface { Name() string // "foobar" Args() string // "<baz> [quux...]" ShortHelp() string // "Foo the first bar" LongHelp() string // "Foo the first bar meeting the following conditions..." // Hidden indicates whether the command should be hidden from the help output. Hidden() bool // Register command specific flags. Register(*flag.FlagSet) // Run executes the function for the command with a context and the command arguments. Run(context.Context, []string) error }
Command defines the interface for each command in a program.
type ContextKey ¶
type ContextKey string
ContextKey defines the type for holding keys in the context.
const ( // GitCommitKey is the key for the program's GitCommit data. GitCommitKey ContextKey = "program.GitCommit" // NameKey is the key for the program's name. NameKey ContextKey = "program.Name" // VersionKey is the key for the program's Version data. VersionKey ContextKey = "program.Version" )
type Program ¶
type Program struct { // Name of the program. Defaults to path.Base(os.Args[0]). Name string // Description of the program. Description string // Version of the program. Version string // GitCommit information for the program. GitCommit string // Commands in the program. Commands []Command // FlagSet holds the common/global flags for the program. FlagSet *flag.FlagSet // Before defines a function to execute before any subcommands are run, // but after the context is ready. // If a non-nil error is returned, no subcommands are run. Before func(context.Context) error // After defines a function to execute after any commands or action is run // and has finished. // It is run _only_ if the subcommand exits without an error. After func(context.Context) error // Action is the function to execute when no subcommands are specified. // It gives the user back the arguments after the flags have been parsed. Action func(context.Context, []string) error }
Program defines the struct for holding information about the program.
func NewProgram ¶
func NewProgram() *Program
NewProgram creates a new Program with some reasonable defaults for Name, Description, and Version.
Example (WithCommand) ¶
package main import ( "context" "flag" "fmt" "os" "github.com/genuinetools/pkg/cli" ) const yoHelp = `Send "yo" to the program.` func (cmd *yoCommand) Name() string { return "yo" } func (cmd *yoCommand) Args() string { return "" } func (cmd *yoCommand) ShortHelp() string { return yoHelp } func (cmd *yoCommand) LongHelp() string { return yoHelp } func (cmd *yoCommand) Hidden() bool { return false } func (cmd *yoCommand) Register(fs *flag.FlagSet) {} type yoCommand struct{} func (cmd *yoCommand) Run(ctx context.Context, args []string) error { fmt.Fprintln(os.Stdout, "yo") return nil } func main() { // Create a new cli program. p := cli.NewProgram() p.Name = "yo" p.Description = `A tool that prints "yo" when you run the command "yo"` // Set the GitCommit and Version. p.GitCommit = "ef2f64f" p.Version = "v0.1.0" // Setup the global flags. var ( debug bool ) p.FlagSet = flag.NewFlagSet("global", flag.ExitOnError) p.FlagSet.BoolVar(&debug, "d", false, "enable debug logging") // Set the before function. p.Before = func(ctx context.Context) error { // Set the log level. if debug { // Setup your logger here... } return nil } // Add our commands. p.Commands = []cli.Command{ &yoCommand{}, } // Run our program. p.Run() }
Output: yo
Example (WithSingleAction) ¶
package main import ( "context" "flag" "fmt" "log" "os" "os/signal" "syscall" "github.com/genuinetools/pkg/cli" ) func main() { // Create a new cli program. p := cli.NewProgram() p.Name = "yo" p.Description = `A tool that prints "yo"` // Set the GitCommit and Version. p.GitCommit = "ef2f64f" p.Version = "v0.1.0" // Setup the global flags. var ( debug bool ) p.FlagSet = flag.NewFlagSet("global", flag.ExitOnError) p.FlagSet.BoolVar(&debug, "d", false, "enable debug logging") // Set the before function. p.Before = func(ctx context.Context) error { // Set the log level. if debug { // Setup your logger here... } return nil } // Set the main program action. p.Action = func(ctx context.Context, args []string) error { // On ^C, or SIGTERM handle exit. c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) signal.Notify(c, syscall.SIGTERM) go func() { for sig := range c { log.Printf("Received %s, exiting.", sig.String()) os.Exit(0) } }() fmt.Fprintln(os.Stdout, "yo") return nil } // Run our program. p.Run() }
Output: yo
Click to show internal directories.
Click to hide internal directories.