Documentation
¶
Overview ¶
Example ¶
package main
import (
"context"
"errors"
"fmt"
"log"
"github.com/bep/simplecobra"
)
func main() {
rootCmd := &rootCommand{name: "root",
commands: []simplecobra.Commander{
&lvl1Command{name: "foo"},
&lvl1Command{name: "bar",
commands: []simplecobra.Commander{
&lvl2Command{name: "baz"},
},
},
},
}
x, err := simplecobra.New(rootCmd)
if err != nil {
log.Fatal(err)
}
cd, err := x.Execute(context.Background(), []string{"bar", "baz", "--localFlagName", "baz_local", "--persistentFlagName", "baz_persistent"})
if err != nil {
log.Fatal(err)
}
// These are wired up in Init().
lvl2 := cd.Command.(*lvl2Command)
lvl1 := lvl2.parentCmd
root := lvl1.rootCmd
fmt.Printf("Executed %s.%s.%s with localFlagName %s and and persistentFlagName %s.\n", root.name, lvl1.name, lvl2.name, lvl2.localFlagName, root.persistentFlagName)
}
type rootCommand struct {
name string
isInit bool
persistentFlagName string
localFlagName string
persistentFlagNameC string
localFlagNameC string
ctx context.Context
initThis *simplecobra.Commandeer
initRunner *simplecobra.Commandeer
failWithCobraCommand bool
failRun bool
commands []simplecobra.Commander
}
func (c *rootCommand) Commands() []simplecobra.Commander {
return c.commands
}
func (c *rootCommand) PreRun(this, runner *simplecobra.Commandeer) error {
c.isInit = true
c.persistentFlagNameC = c.persistentFlagName + "_rootCommand_compiled"
c.localFlagNameC = c.localFlagName + "_rootCommand_compiled"
c.initThis = this
c.initRunner = runner
return nil
}
func (c *rootCommand) Name() string {
return c.name
}
func (c *rootCommand) Run(ctx context.Context, cd *simplecobra.Commandeer, args []string) error {
if c.failRun {
return errors.New("failRun")
}
c.ctx = ctx
return nil
}
func (c *rootCommand) Init(cd *simplecobra.Commandeer) error {
if c.failWithCobraCommand {
return errors.New("failWithCobraCommand")
}
cmd := cd.CobraCommand
localFlags := cmd.Flags()
persistentFlags := cmd.PersistentFlags()
localFlags.StringVar(&c.localFlagName, "localFlagName", "", "set localFlagName")
persistentFlags.StringVar(&c.persistentFlagName, "persistentFlagName", "", "set persistentFlagName")
return nil
}
type lvl1Command struct {
name string
isInit bool
aliases []string
localFlagName string
localFlagNameC string
failInit bool
failWithCobraCommand bool
disableSuggestions bool
rootCmd *rootCommand
commands []simplecobra.Commander
ctx context.Context
}
func (c *lvl1Command) Commands() []simplecobra.Commander {
return c.commands
}
func (c *lvl1Command) PreRun(this, runner *simplecobra.Commandeer) error {
if c.failInit {
return fmt.Errorf("failInit")
}
c.isInit = true
c.localFlagNameC = c.localFlagName + "_lvl1Command_compiled"
c.rootCmd = this.Root.Command.(*rootCommand)
return nil
}
func (c *lvl1Command) Name() string {
return c.name
}
func (c *lvl1Command) Run(ctx context.Context, cd *simplecobra.Commandeer, args []string) error {
c.ctx = ctx
return nil
}
func (c *lvl1Command) Init(cd *simplecobra.Commandeer) error {
if c.failWithCobraCommand {
return errors.New("failWithCobraCommand")
}
cmd := cd.CobraCommand
cmd.DisableSuggestions = c.disableSuggestions
cmd.Aliases = c.aliases
localFlags := cmd.Flags()
localFlags.StringVar(&c.localFlagName, "localFlagName", "", "set localFlagName for lvl1Command")
return nil
}
type lvl2Command struct {
name string
isInit bool
localFlagName string
ctx context.Context
rootCmd *rootCommand
parentCmd *lvl1Command
}
func (c *lvl2Command) Commands() []simplecobra.Commander {
return nil
}
func (c *lvl2Command) PreRun(this, runner *simplecobra.Commandeer) error {
c.isInit = true
c.rootCmd = this.Root.Command.(*rootCommand)
c.parentCmd = this.Parent.Command.(*lvl1Command)
return nil
}
func (c *lvl2Command) Name() string {
return c.name
}
func (c *lvl2Command) Run(ctx context.Context, cd *simplecobra.Commandeer, args []string) error {
c.ctx = ctx
return nil
}
func (c *lvl2Command) Init(cd *simplecobra.Commandeer) error {
cmd := cd.CobraCommand
localFlags := cmd.Flags()
localFlags.StringVar(&c.localFlagName, "localFlagName", "", "set localFlagName for lvl2Command")
return nil
}
Output: Executed root.bar.baz with localFlagName baz_local and and persistentFlagName baz_persistent.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func IsCommandError ¶
IsCommandError reports whether any error in err's tree matches CommandError.
Types ¶
type CommandError ¶
type CommandError struct {
Err error
}
CommandError is returned when a command fails because of a user error (unknown command, invalid flag etc.). All other errors comes from the execution of the command.
func (*CommandError) Is ¶ added in v0.2.0
func (*CommandError) Is(e error) bool
Is reports whether e is of type *CommandError.
type Commandeer ¶
type Commandeer struct {
Command Commander
CobraCommand *cobra.Command
Root *Commandeer
Parent *Commandeer
// contains filtered or unexported fields
}
Commandeer holds the state of a command and its subcommands.
type Commander ¶
type Commander interface {
// The name of the command.
Name() string
// Init is called when the cobra command is created.
// This is where the flags, short and long description etc. can be added.
Init(*Commandeer) error
// PreRun called on all ancestors and the executing command itself, before execution, starting from the root.
// This is the place to evaluate flags and set up the this Commandeer.
// The runner Commandeer holds the currently running command, which will be PreRun last.
PreRun(this, runner *Commandeer) error
// The command execution.
Run(ctx context.Context, cd *Commandeer, args []string) error
// Commands returns the sub commands, if any.
Commands() []Commander
}
Commander is the interface that must be implemented by all commands.
Click to show internal directories.
Click to hide internal directories.