diff options
author | Martin Treusch von Buttlar <martin.tvb@vitraum.de> | 2017-05-22 09:00:23 +0200 |
---|---|---|
committer | Martin Treusch von Buttlar <martin.tvb@vitraum.de> | 2017-05-22 09:00:23 +0200 |
commit | 9f4c550b8be0f80fd670f7ded32dbd4aab8d1f4e (patch) | |
tree | d4b3ef3ec0ac61a210ca079861e1334ca29a70c8 /cmd/ponzu/usage.go | |
parent | 4c03187fbef64573ded62f40d5d4dace6c48747b (diff) |
add help flags for sub commands to root cmd
Diffstat (limited to 'cmd/ponzu/usage.go')
-rw-r--r-- | cmd/ponzu/usage.go | 121 |
1 files changed, 77 insertions, 44 deletions
diff --git a/cmd/ponzu/usage.go b/cmd/ponzu/usage.go index 3046be7..9a78587 100644 --- a/cmd/ponzu/usage.go +++ b/cmd/ponzu/usage.go @@ -1,64 +1,97 @@ package main import ( - "encoding/json" "fmt" - "io/ioutil" - "os" - "path/filepath" + "sort" + "strings" + "text/template" + "unicode" "github.com/spf13/cobra" ) -var versionCmd = &cobra.Command{ - Use: "version", - Aliases: []string{"v"}, - Short: "Prints the version of Ponzu your project is using.", - Long: `Prints the version of Ponzu your project is using. Must be called from -within a Ponzu project directory.`, - Example: `$ ponzu version -> Ponzu v0.7.1 -(or) -$ ponzu --cli version -> Ponzu v0.7.2`, +var templateFuncs = template.FuncMap{ + "rpad": rpad, + "trimTrailingWhitespaces": trimRightSpace, +} + +var tmpl = `{{with (or .Cmd.Long .Cmd.Short)}}{{. | trimTrailingWhitespaces}} + +{{end}}{{if or .Cmd.Runnable .Cmd.HasSubCommands}}Usage:{{if .Cmd.Runnable}} + {{.Cmd.UseLine}}{{end}}{{if .Cmd.HasAvailableSubCommands}} + {{.Cmd.CommandPath}} [command]{{end}}{{if gt (len .Cmd.Aliases) 0}} + +Aliases: + {{.Cmd.NameAndAliases}}{{end}}{{if .Cmd.HasExample}} + +Examples: +{{.Cmd.Example}}{{end}}{{if .Cmd.HasAvailableSubCommands}} + +Available Commands:{{range .Cmd.Commands}}{{if (or .IsAvailableCommand false)}} + {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{if .Cmd.HasAvailableLocalFlags}} + +Flags for all commands: +{{.Cmd.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{range .Subs}}{{if (and .IsAvailableCommand .HasAvailableLocalFlags)}} + +Flags for '{{.Name}}' command: +{{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{end}}{{if .Cmd.HasHelpSubCommands}} + +Additional help topics:{{range .Cmd.Commands}}{{if .Cmd.IsAdditionalHelpTopicCommand}} + {{rpad .Cmd.CommandPath .Cmd.CommandPathPadding}} {{.Cmd.Short}}{{end}}{{end}}{{end}}{{if .Cmd.HasAvailableSubCommands}} + +Use "{{.Cmd.CommandPath}} [command] --help" for more information about a command.{{end}} +{{end}}` + +var helpCmd = &cobra.Command{ + Use: "help", + Short: "help about any command", Run: func(cmd *cobra.Command, args []string) { - p, err := ponzu(cli) - if err != nil { - fmt.Println(err) - os.Exit(1) + cmd, _, e := rootCmd.Find(args) + if cmd == nil || e != nil { + rootCmd.Printf("Unknown help topic %#q\n", args) + rootCmd.Usage() + return + } + t := template.New("help") + t.Funcs(templateFuncs) + template.Must(t.Parse(tmpl)) + if len(args) > 0 { + rootCmd.HelpFunc()(cmd, args) + return } - fmt.Fprintf(os.Stdout, "Ponzu v%s\n", p["version"]) - }, -} - -func ponzu(isCLI bool) (map[string]interface{}, error) { - kv := make(map[string]interface{}) + sortByName := func(i, j int) bool { return cmds[i].Name() < cmds[j].Name() } + sort.Slice(cmds, sortByName) - info := filepath.Join("cmd", "ponzu", "ponzu.json") - if isCLI { - gopath, err := getGOPATH() + err := t.Execute(cmd.OutOrStdout(), struct { + Cmd *cobra.Command + Subs []*cobra.Command + }{ + Cmd: rootCmd, + Subs: cmds}) if err != nil { - return nil, err + cmd.Println(err) } - repo := filepath.Join(gopath, "src", "github.com", "ponzu-cms", "ponzu") - info = filepath.Join(repo, "cmd", "ponzu", "ponzu.json") - } - - b, err := ioutil.ReadFile(info) - if err != nil { - return nil, err - } + }, +} - err = json.Unmarshal(b, &kv) - if err != nil { - return nil, err - } +var cmds []*cobra.Command - return kv, nil +func RegisterCmdlineCommand(cmd *cobra.Command) { + rootCmd.AddCommand(cmd) + cmds = append(cmds, cmd) } func init() { - versionCmd.Flags().BoolVar(&cli, "cli", false, "specify that information should be returned about the CLI, not project") - rootCmd.AddCommand(versionCmd) + rootCmd.AddCommand(helpCmd) +} + +// rpad adds padding to the right of a string. +func rpad(s string, padding int) string { + template := fmt.Sprintf("%%-%ds", padding) + return fmt.Sprintf(template, s) +} + +func trimRightSpace(s string) string { + return strings.TrimRightFunc(s, unicode.IsSpace) } |