123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- package cli
- import (
- "fmt"
- "strings"
- "github.com/spf13/cobra"
- )
- // SetupRootCommand sets default usage, help, and error handling for the
- // root command.
- func SetupRootCommand(rootCmd *cobra.Command) {
- cobra.AddTemplateFunc("hasSubCommands", hasSubCommands)
- cobra.AddTemplateFunc("hasManagementSubCommands", hasManagementSubCommands)
- cobra.AddTemplateFunc("operationSubCommands", operationSubCommands)
- cobra.AddTemplateFunc("managementSubCommands", managementSubCommands)
- rootCmd.SetUsageTemplate(usageTemplate)
- rootCmd.SetHelpTemplate(helpTemplate)
- rootCmd.SetFlagErrorFunc(FlagErrorFunc)
- rootCmd.SetHelpCommand(helpCommand)
- rootCmd.PersistentFlags().BoolP("help", "h", false, "Print usage")
- rootCmd.PersistentFlags().MarkShorthandDeprecated("help", "please use --help")
- }
- // FlagErrorFunc prints an error message which matches the format of the
- // docker/docker/cli error messages
- func FlagErrorFunc(cmd *cobra.Command, err error) error {
- if err == nil {
- return err
- }
- usage := ""
- if cmd.HasSubCommands() {
- usage = "\n\n" + cmd.UsageString()
- }
- return StatusError{
- Status: fmt.Sprintf("%s\nSee '%s --help'.%s", err, cmd.CommandPath(), usage),
- StatusCode: 125,
- }
- }
- var helpCommand = &cobra.Command{
- Use: "help [command]",
- Short: "Help about the command",
- PersistentPreRun: func(cmd *cobra.Command, args []string) {},
- PersistentPostRun: func(cmd *cobra.Command, args []string) {},
- RunE: func(c *cobra.Command, args []string) error {
- cmd, args, e := c.Root().Find(args)
- if cmd == nil || e != nil || len(args) > 0 {
- return fmt.Errorf("unknown help topic: %v", strings.Join(args, " "))
- }
- helpFunc := cmd.HelpFunc()
- helpFunc(cmd, args)
- return nil
- },
- }
- func hasSubCommands(cmd *cobra.Command) bool {
- return len(operationSubCommands(cmd)) > 0
- }
- func hasManagementSubCommands(cmd *cobra.Command) bool {
- return len(managementSubCommands(cmd)) > 0
- }
- func operationSubCommands(cmd *cobra.Command) []*cobra.Command {
- cmds := []*cobra.Command{}
- for _, sub := range cmd.Commands() {
- if sub.IsAvailableCommand() && !sub.HasSubCommands() {
- cmds = append(cmds, sub)
- }
- }
- return cmds
- }
- func managementSubCommands(cmd *cobra.Command) []*cobra.Command {
- cmds := []*cobra.Command{}
- for _, sub := range cmd.Commands() {
- if sub.IsAvailableCommand() && sub.HasSubCommands() {
- cmds = append(cmds, sub)
- }
- }
- return cmds
- }
- var usageTemplate = `Usage:
- {{- if not .HasSubCommands}} {{.UseLine}}{{end}}
- {{- if .HasSubCommands}} {{ .CommandPath}} COMMAND{{end}}
- {{ .Short | trim }}
- {{- if gt .Aliases 0}}
- Aliases:
- {{.NameAndAliases}}
- {{- end}}
- {{- if .HasExample}}
- Examples:
- {{ .Example }}
- {{- end}}
- {{- if .HasFlags}}
- Options:
- {{.Flags.FlagUsages | trimRightSpace}}
- {{- end}}
- {{- if hasManagementSubCommands . }}
- Management Commands:
- {{- range managementSubCommands . }}
- {{rpad .Name .NamePadding }} {{.Short}}
- {{- end}}
- {{- end}}
- {{- if hasSubCommands .}}
- Commands:
- {{- range operationSubCommands . }}
- {{rpad .Name .NamePadding }} {{.Short}}
- {{- end}}
- {{- end}}
- {{- if .HasSubCommands }}
- Run '{{.CommandPath}} COMMAND --help' for more information on a command.
- {{- end}}
- `
- var helpTemplate = `
- {{if or .Runnable .HasSubCommands}}{{.UsageString}}{{end}}`
|