Add custom help function to command

This commit is contained in:
Brendan Le Glaunec 2019-12-02 17:34:06 +01:00 committed by Traefiker Bot
parent cf1ace3a73
commit 4cb9eec257
3 changed files with 82 additions and 10 deletions

View file

@ -4,18 +4,20 @@ package cli
import (
"fmt"
"io"
"os"
"path/filepath"
)
// Command structure contains program/command information (command name and description).
type Command struct {
Name string
Description string
Configuration interface{}
Resources []ResourceLoader
Run func([]string) error
Hidden bool
Name string
Description string
Configuration interface{}
Resources []ResourceLoader
Run func([]string) error
CustomHelpFunc func(io.Writer, *Command) error
Hidden bool
// AllowArg if not set, disallows any argument that is not a known command or a sub-command.
AllowArg bool
subCommands []*Command
@ -35,6 +37,15 @@ func (c *Command) AddCommand(cmd *Command) error {
return nil
}
// PrintHelp calls the custom help function of the command if it's set.
// Otherwise, it calls the default help function.
func (c *Command) PrintHelp(w io.Writer) error {
if c.CustomHelpFunc != nil {
return c.CustomHelpFunc(w, c)
}
return PrintHelp(w, c)
}
// Execute Executes a command.
func Execute(cmd *Command) error {
return execute(cmd, os.Args, true)
@ -92,16 +103,16 @@ func execute(cmd *Command, args []string, root bool) error {
func run(cmd *Command, args []string) error {
if len(args) > 0 && !isFlag(args[0]) && !cmd.AllowArg {
_ = PrintHelp(os.Stdout, cmd)
_ = cmd.PrintHelp(os.Stdout)
return fmt.Errorf("command not found: %s", args[0])
}
if isHelp(args) {
return PrintHelp(os.Stdout, cmd)
return cmd.PrintHelp(os.Stdout)
}
if cmd.Run == nil {
_ = PrintHelp(os.Stdout, cmd)
_ = cmd.PrintHelp(os.Stdout)
return fmt.Errorf("command %s is not runnable", cmd.Name)
}