first commit status: option and argument parsing, short aliases grouping, special values, hidden options
Option types: bool int, int-array, string, string-array, string-map, file, dir
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
package cli
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Usage()
|
||||
func (cli *CliParser) Usage() string {
|
||||
var sb strings.Builder
|
||||
|
||||
program, _ := cli.GetVersionSection("program")
|
||||
publicCount := cli.publicOptionCount()
|
||||
if publicCount > 0 {
|
||||
fmt.Fprintf(&sb, "USAGE: %s [<options>] %s\n", program, cli.getArgsTemplate())
|
||||
} else {
|
||||
fmt.Fprintf(&sb, "USAGE: %s %s\n", program, cli.getArgsTemplate())
|
||||
}
|
||||
|
||||
if len(cli.argSpecs) > 0 || len(cli.options) > 0 {
|
||||
fmt.Fprintf(&sb, "where:\n")
|
||||
if len(cli.argSpecs) > 0 {
|
||||
for _, argSpec := range cli.argSpecs {
|
||||
arg := argSpec.getBase()
|
||||
fmt.Fprintf(&sb, " <%s> %s\n", arg.name, arg.description)
|
||||
}
|
||||
}
|
||||
if publicCount > 0 {
|
||||
fmt.Fprintf(&sb, " <options>\n")
|
||||
templates, maxWidth := cli.makeOptionTemplateList()
|
||||
for i, opti := range cli.options {
|
||||
if opti.isHidden() {
|
||||
continue
|
||||
}
|
||||
opt := opti.getBase()
|
||||
aliases := opt.aliases
|
||||
if len(aliases) > 0 && opt.isArray {
|
||||
// Skip the last alias because it is the implicit plural alias
|
||||
aliases = aliases[0 : len(aliases)-1]
|
||||
}
|
||||
if len(aliases) > 0 {
|
||||
fmt.Fprintf(&sb, " %-*s %s (alias: %s)", maxWidth, templates[i], opt.description, strings.Join(aliases, ", "))
|
||||
} else {
|
||||
fmt.Fprintf(&sb, " %-*s %s", maxWidth, templates[i], opt.description)
|
||||
}
|
||||
if value := opti.getDefaultValue(); value != "" {
|
||||
fmt.Fprintf(&sb, " (default: %q)", value)
|
||||
}
|
||||
sb.WriteByte('\n')
|
||||
}
|
||||
}
|
||||
}
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
func (cli *CliParser) publicOptionCount() (count int) {
|
||||
for _, opti := range cli.options {
|
||||
opt := opti.getBase()
|
||||
if !opt.hidden {
|
||||
count++
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (cli *CliParser) makeOptionTemplateList() (templates []string, maxWidth int) {
|
||||
maxWidth = 0
|
||||
templates = make([]string, len(cli.options))
|
||||
for i, opti := range cli.options {
|
||||
if opti.isHidden() {
|
||||
templates[i] = ""
|
||||
} else {
|
||||
templates[i] = opti.getTemplate()
|
||||
if len(templates[i]) > maxWidth {
|
||||
maxWidth = len(templates[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
return templates, maxWidth
|
||||
}
|
||||
|
||||
// PrintUsage()
|
||||
func (cli *CliParser) PrintUsage() {
|
||||
os.Stdout.WriteString(cli.Usage())
|
||||
}
|
||||
Reference in New Issue
Block a user