This repository was archived by the owner on Aug 26, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathhelp.go
124 lines (105 loc) · 2.57 KB
/
help.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package main
import (
"flag"
"fmt"
"strings"
"text/template"
)
var (
cmdHelp = &Command{
Name: "help",
Summary: "Show a list of commands or help for one command",
Usage: "[COMMAND]",
Description: "Show a list of commands or detailed help for one command",
Run: runHelp,
}
globalUsageTemplate *template.Template
commandUsageTemplate *template.Template
templFuncs = template.FuncMap{
"descToLines": func(s string) []string {
// trim leading/trailing whitespace and split into slice of lines
return strings.Split(strings.Trim(s, "\n\t "), "\n")
},
"printOption": func(name, defvalue, usage string) string {
prefix := "--"
if len(name) == 1 {
prefix = "-"
}
return fmt.Sprintf("\t%s%s=%s\t%s", prefix, name, defvalue, usage)
},
}
)
func init() {
globalUsageTemplate = template.Must(template.New("global_usage").Funcs(templFuncs).Parse(`
NAME:
{{printf "\t%s - %s" .Executable .Description}}
USAGE:
{{printf "\t%s" .Executable}} [global options] <command> [command options] [arguments...]
VERSION:
{{printf "\t%s" .Version}}
COMMANDS:{{range .Commands}}
{{printf "\t%s\t%s" .Name .Summary}}{{end}}
GLOBAL OPTIONS:{{range .Flags}}
{{printOption .Name .DefValue .Usage}}{{end}}
Run "{{.Executable}} help <command>" for more details on a specific command.
`[1:]))
commandUsageTemplate = template.Must(template.New("command_usage").Funcs(templFuncs).Parse(`
NAME:
{{printf "\t%s - %s" .Cmd.Name .Cmd.Summary}}
USAGE:
{{printf "\t%s %s %s" .Executable .Cmd.Name .Cmd.Usage}}
DESCRIPTION:
{{range $line := descToLines .Cmd.Description}}{{printf "\t%s" $line}}
{{end}}
{{if .CmdFlags}}OPTIONS:{{range .CmdFlags}}
{{printOption .Name .DefValue .Usage}}{{end}}
{{end}}For help on global options run "{{.Executable}} help"
`[1:]))
}
func runHelp(args []string) (exit int) {
if len(args) < 1 {
printGlobalUsage()
return
}
var cmd *Command
for _, c := range commands {
if c.Name == args[0] {
cmd = c
break
}
}
if cmd == nil {
fmt.Println("Unrecognized command:", args[0])
return 1
}
printCommandUsage(cmd)
return
}
func printGlobalUsage() {
globalUsageTemplate.Execute(out, struct {
Executable string
Commands []*Command
Flags []*flag.Flag
Description string
Version string
}{
cliName,
commands,
getAllFlags(),
cliDescription,
projectVersion,
})
out.Flush()
}
func printCommandUsage(cmd *Command) {
commandUsageTemplate.Execute(out, struct {
Executable string
Cmd *Command
CmdFlags []*flag.Flag
}{
cliName,
cmd,
getFlags(&cmd.Flags),
})
out.Flush()
}