Documentation & housecleaning

This commit is contained in:
spf13 2013-09-11 09:20:59 -04:00
parent 7ba2df2eff
commit 8d87882095

View file

@ -26,47 +26,36 @@ import (
var _ = flag.ContinueOnError var _ = flag.ContinueOnError
type Flag interface {
Args() []string
}
type Flags interface {
Lookup(string) *Flag
VisitAll(fn func(*Flag))
Parse(arguments []string) error
}
// A Commander holds the configuration for the command line tool. // A Commander holds the configuration for the command line tool.
type Commander struct { type Commander struct {
// A Commander is also a Command for top level and global help & flags // A Commander is also a Command for top level and global help & flags
Command Command
//ExitOnError, ContinueOnError or PanicOnError
behavior flag.ErrorHandling
args []string args []string
} }
// Provide the user with a new commander.
// Not of a lot of value today, was intended to do more than just
// create a new commander.
func NewCommander() (c *Commander) { func NewCommander() (c *Commander) {
c = new(Commander) c = new(Commander)
return return
} }
func (c *Commander) setFlagBehavior(b flag.ErrorHandling) error { // Name for commander, should match application name
if b == flag.ExitOnError || b == flag.ContinueOnError || b == flag.PanicOnError {
c.behavior = b
return nil
}
return fmt.Errorf("%v is not a valid behavior", b)
}
func (c *Commander) SetName(name string) { func (c *Commander) SetName(name string) {
c.name = name c.name = name
} }
// os.Args[1:] by default, if desired, can be overridden
// particularly useful when testing.
func (c *Commander) SetArgs(a []string) { func (c *Commander) SetArgs(a []string) {
c.args = a c.args = a
} }
// Call execute to use the args (os.Args[1:] by default)
// and run through the command tree finding appropriate matches
// for commands and then corresponding flags.
func (c *Commander) Execute() (err error) { func (c *Commander) Execute() (err error) {
if len(c.args) == 0 { if len(c.args) == 0 {
err = c.execute(os.Args[1:]) err = c.execute(os.Args[1:])
@ -182,6 +171,8 @@ func (c *Command) Usage(depth ...int) string {
} }
} }
// For use in determining which flags have been assigned to which commands
// and which persist
func (c *Command) DebugFlags() { func (c *Command) DebugFlags() {
fmt.Println("DebugFlags called on", c.Name()) fmt.Println("DebugFlags called on", c.Name())
var debugflags func(*Command) var debugflags func(*Command)
@ -257,7 +248,7 @@ func (c *Command) HasSubCommands() bool {
return len(c.commands) > 0 return len(c.commands) > 0
} }
// Determine if the command has children commands // Determine if the command is a child command
func (c *Command) HasParent() bool { func (c *Command) HasParent() bool {
return c.parent != nil return c.parent != nil
} }
@ -295,10 +286,12 @@ func (c *Command) ResetFlags() {
c.pflags.SetOutput(c.flagErrorBuf) c.pflags.SetOutput(c.flagErrorBuf)
} }
// Does the command contain flags (local not persistent)
func (c *Command) HasFlags() bool { func (c *Command) HasFlags() bool {
return c.Flags().HasFlags() return c.Flags().HasFlags()
} }
// Does the command contain persistent flags
func (c *Command) HasPersistentFlags() bool { func (c *Command) HasPersistentFlags() bool {
return c.PersistentFlags().HasFlags() return c.PersistentFlags().HasFlags()
} }
@ -355,23 +348,3 @@ func (c *Command) mergePersistentFlags() {
rmerge(c) rmerge(c)
} }
// Climbs up the command tree parsing flags from top to bottom
func (c *Command) ParsePersistentFlags(args []string) (err error) {
if !c.HasParent() || (c.parent.HasPersistentFlags() && c.parent.PersistentFlags().Parsed()) {
if c.HasPersistentFlags() {
err = c.PersistentFlags().Parse(args)
if err != nil {
return err
}
}
} else {
if c.HasParent() && c.parent.HasPersistentFlags() {
err = c.parent.ParsePersistentFlags(args)
if err != nil {
return err
}
}
}
return
}