Documentation
¶
Overview ¶
CLI package ¶
This package contains the implementation for a minimal opinionated flags framework similar to spf13/cobra. It all centers around the `cli.Command` type but provides less functionality.
To create a new CLI application:
```go app := cli.NewApp("mig") app.AddCommand("version", version.Name, version.New)
if err := app.Run(); err != nil {
return err
}
```
The `version.New` is a `func() *cli.Command`.
The Command type defines Name and Title as strings, equivalent to cobra `Command.Use` (Name) and `Command.Long` (Title). There is no equivalent of `Command.Short`.
The API choices are different, cobra's `AddCommand` took a command, and the command type was passed into Run().
The cli package creates a `CommandInfo` with AddCommand, and then calls the constructor of the `*Command` type. The type must have Run filled, and can implement Bind(*FlagSet) to read in CLI flags.
The Run function is context aware, supporting observability.
Index ¶
- func ParseWithFlagSet(fs *FlagSet, args []string) error
- type App
- func (app *App) AddCommand(name, title string, constructor func() *Command)
- func (app *App) FindCommand(commands []string, fallback string) (*Command, error)
- func (app *App) HasCommand(name string) bool
- func (app *App) Help()
- func (app *App) HelpCommand(fs *FlagSet, command *Command)
- func (app *App) ParseCommands(args []string) []string
- func (app *App) Run() error
- func (app *App) RunWithArgs(args []string) error
- type Command
- type CommandInfo
- type FlagSet
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func ParseWithFlagSet ¶
ParseWithFlagSet parses flags and environment variables for a scoped FlagSet.
Types ¶
type App ¶
App is the cli entrypoint.
Example ¶
package main
import (
"context"
"fmt"
"github.com/titpetric/cli"
)
func main() {
app := cli.NewApp("mig")
app.AddCommand("version", "Print version information", func() *cli.Command {
var verbose bool
return &cli.Command{
Name: "version",
Title: "Print version information",
Bind: func(fs *cli.FlagSet) {
fs.BoolVarP(&verbose, "verbose", "v", false, "enable verbose output")
},
Run: func(ctx context.Context, args []string) error {
if verbose {
fmt.Println("mig version 1.2.3 (commit abcdef)")
} else {
fmt.Println("mig version 1.2.3")
}
return nil
},
}
})
// In a real program you would call:
// _ = app.Run()
//
// For examples/tests, invoke RunWithArgs directly.
_ = app.RunWithArgs([]string{"version"})
}
Output: mig version 1.2.3
func (*App) AddCommand ¶
AddCommand adds a command to the app.
func (*App) FindCommand ¶
FindCommand finds a command for the app.
func (*App) HasCommand ¶ added in v0.2.1
HasCommand checks if a command exists in the app.
func (*App) HelpCommand ¶
HelpCommand prints out help for a specific command.
func (*App) ParseCommands ¶ added in v0.2.2
ParseCommands cleans up args[], returning only commands. If no commands are detected, DefaultCommand is returned.
func (*App) RunWithArgs ¶
RunWithArgs is a cli entrypoint which sets up a cancellable context for the command.
type Command ¶
type Command struct {
Name string
Title string
Default bool
Usage func() string
Bind func(*FlagSet)
Run func(context.Context, []string) error
// Flags is a separate FlagSet containing only command-specific
// flags (excluding root-level flags like --help). It is populated
// automatically by App.RunWithArgs and can be used to print
// command flag defaults without the --help flag.
Flags *FlagSet
}
Command is an individual command.
type CommandInfo ¶
CommandInfo is the constructor info for a command