forked from mirror/cobra
Redo HelpFunc() to work things other than the help subcommand
Today the HelpFunc() seemed to be tailor built for the `help` subcommand. Which has a rather weird purpose as its `Run` needs to find the actual command we want to get help about. Instead make the HelpFunc() for a command be about that command, rather than having it search for some other command...
This commit is contained in:
parent
1f92281ffc
commit
27bf24802c
43
command.go
43
command.go
|
@ -188,35 +188,24 @@ func (c *Command) UsageFunc() (f func(*Command) error) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// HelpFunc returns either the function set by SetHelpFunc for this command
|
||||
// or a parent, or it returns a function which calls c.Help()
|
||||
func (c *Command) HelpFunc() func(*Command, []string) {
|
||||
if c.helpFunc != nil {
|
||||
return c.helpFunc
|
||||
cmd := c
|
||||
for cmd != nil {
|
||||
if cmd.helpFunc != nil {
|
||||
return cmd.helpFunc
|
||||
}
|
||||
|
||||
if c.HasParent() {
|
||||
return c.parent.HelpFunc()
|
||||
} else {
|
||||
return func(c *Command, args []string) {
|
||||
if len(args) == 0 {
|
||||
// Help called without any topic, calling on root
|
||||
c.Root().Help()
|
||||
return
|
||||
cmd = cmd.parent
|
||||
}
|
||||
|
||||
cmd, _, e := c.Root().Find(args)
|
||||
if cmd == nil || e != nil {
|
||||
c.Printf("Unknown help topic %#q.", args)
|
||||
|
||||
c.Root().Usage()
|
||||
} else {
|
||||
err := cmd.Help()
|
||||
return func(*Command, []string) {
|
||||
err := c.Help()
|
||||
if err != nil {
|
||||
c.Println(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var minUsagePadding int = 25
|
||||
|
||||
|
@ -620,9 +609,19 @@ func (c *Command) initHelpCmd() {
|
|||
Short: "Help about any command",
|
||||
Long: `Help provides help for any command in the application.
|
||||
Simply type ` + c.Name() + ` help [path to command] for full details.`,
|
||||
Run: c.HelpFunc(),
|
||||
PersistentPreRun: func(cmd *Command, args []string) {},
|
||||
PersistentPostRun: func(cmd *Command, args []string) {},
|
||||
|
||||
Run: func(c *Command, args []string) {
|
||||
cmd, _, e := c.Root().Find(args)
|
||||
if cmd == nil || e != nil {
|
||||
c.Printf("Unknown help topic %#q.", args)
|
||||
c.Root().Usage()
|
||||
} else {
|
||||
helpFunc := cmd.HelpFunc()
|
||||
helpFunc(cmd, args)
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
c.AddCommand(c.helpCommand)
|
||||
|
|
Loading…
Reference in New Issue