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
help string
wasPresent bool
isBool bool
}
// 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())
}
// Specify that it is a bool for usage
if scalarType.Kind() == reflect.Bool {
spec.isBool = true
}
// Look at the tag
if tag != "" {
for _, key := range strings.Split(tag, ",") {


+ 24
- 20
usage.go View File

@ -5,7 +5,6 @@ import (
"io"
"os"
"path/filepath"
"reflect"
"strings"
)
@ -78,30 +77,35 @@ func (p *Parser) WriteHelp(w io.Writer) {
}
// 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 {
if spec.dest.Kind() == reflect.Bool {
if spec.isBool {
return form
}
return form + " " + strings.ToUpper(spec.long)


+ 1
- 0
usage_test.go View File

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


Loading…
Cancel
Save