Browse Source

Add built ins to options in help output

Adds help to the options in help output with an easy way to add more
built ins.
Fredrik Wallgren 10 years ago
parent
commit
330a0da571
No known key found for this signature in database GPG Key ID: F47F4EC105BDC53E
3 changed files with 31 additions and 20 deletions
  1. +6
    -0
      parse.go
  2. +24
    -20
      usage.go
  3. +1
    -0
      usage_test.go

+ 6
- 0
parse.go View File

@ -54,6 +54,7 @@ type spec struct {
positional bool positional bool
help string help string
wasPresent bool wasPresent bool
isBool bool
} }
// ErrHelp indicates that -h or --help were provided // ErrHelp indicates that -h or --help were provided
@ -135,6 +136,11 @@ func NewParser(dests ...interface{}) (*Parser, error) {
return nil, fmt.Errorf("%s.%s: %s fields are not supported", t.Name(), field.Name, scalarType.Kind()) return nil, fmt.Errorf("%s.%s: %s fields are not supported", t.Name(), field.Name, scalarType.Kind())
} }
// Specify that it is a bool for usage
if scalarType.Kind() == reflect.Bool {
spec.isBool = true
}
// Look at the tag // Look at the tag
if tag != "" { if tag != "" {
for _, key := range strings.Split(tag, ",") { for _, key := range strings.Split(tag, ",") {


+ 24
- 20
usage.go View File

@ -5,7 +5,6 @@ import (
"io" "io"
"os" "os"
"path/filepath" "path/filepath"
"reflect"
"strings" "strings"
) )
@ -78,30 +77,35 @@ func (p *Parser) WriteHelp(w io.Writer) {
} }
// write the list of options // write the list of options
if len(options) > 0 {
fmt.Fprint(w, "\noptions:\n")
const colWidth = 25
for _, spec := range options {
left := " " + synopsis(spec, "--"+spec.long)
if spec.short != "" {
left += ", " + synopsis(spec, "-"+spec.short)
}
fmt.Fprint(w, left)
if spec.help != "" {
if len(left)+2 < colWidth {
fmt.Fprint(w, strings.Repeat(" ", colWidth-len(left)))
} else {
fmt.Fprint(w, "\n"+strings.Repeat(" ", colWidth))
}
fmt.Fprint(w, spec.help)
}
fmt.Fprint(w, "\n")
fmt.Fprint(w, "\noptions:\n")
for _, spec := range options {
printOption(w, spec)
}
// write the list of built in options
printOption(w, &spec{isBool: true, long: "help", short: "h", help: "display this help and exit"})
}
func printOption(w io.Writer, spec *spec) {
const colWidth = 25
left := " " + synopsis(spec, "--"+spec.long)
if spec.short != "" {
left += ", " + synopsis(spec, "-"+spec.short)
}
fmt.Fprint(w, left)
if spec.help != "" {
if len(left)+2 < colWidth {
fmt.Fprint(w, strings.Repeat(" ", colWidth-len(left)))
} else {
fmt.Fprint(w, "\n"+strings.Repeat(" ", colWidth))
} }
fmt.Fprint(w, spec.help)
} }
fmt.Fprint(w, "\n")
} }
func synopsis(spec *spec, form string) string { func synopsis(spec *spec, form string) string {
if spec.dest.Kind() == reflect.Bool {
if spec.isBool {
return form return form
} }
return form + " " + strings.ToUpper(spec.long) return form + " " + strings.ToUpper(spec.long)


+ 1
- 0
usage_test.go View File

@ -23,6 +23,7 @@ options:
--dataset DATASET dataset to use --dataset DATASET dataset to use
--optimize OPTIMIZE, -O OPTIMIZE --optimize OPTIMIZE, -O OPTIMIZE
optimization level optimization level
--help, -h display this help and exit
` `
var args struct { var args struct {
Input string `arg:"positional"` Input string `arg:"positional"`


Loading…
Cancel
Save