flags rewrite : just well defined structs and a clear switch block
This commit is contained in:
parent
123eabca54
commit
f23a98fb5d
3 changed files with 63 additions and 76 deletions
|
|
@ -5,20 +5,34 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Flag string
|
type Arg struct {
|
||||||
|
Val string
|
||||||
func (f Flag) Dash() string {
|
Help string
|
||||||
return fmt.Sprintf("--%s", f)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// prepend --flag to args if a flag isn't there:
|
type Flag struct {
|
||||||
// allows trailing flags:
|
Long string
|
||||||
// um tag foo --invert
|
Short string
|
||||||
// becomes:
|
Val string
|
||||||
// um tag --query foo --invert
|
Help string
|
||||||
func PrependFlagToArgs(args []string, flag Flag) []string {
|
}
|
||||||
if len(args) >= 1 && !strings.HasPrefix(args[0], "-") {
|
|
||||||
args = append([]string{flag.Dash()}, args...)
|
// there's got to be a way to generalize the val field to string|bool
|
||||||
}
|
type FlagBool struct {
|
||||||
return args
|
Long string
|
||||||
|
Short string
|
||||||
|
Val bool
|
||||||
|
Help string
|
||||||
|
}
|
||||||
|
|
||||||
|
func HasDashPrefix(s string) bool {
|
||||||
|
return strings.HasPrefix(s, "-")
|
||||||
|
}
|
||||||
|
|
||||||
|
func MissingValueArg(args []string, i int) bool {
|
||||||
|
return i+1 == len(args) || HasDashPrefix(args[i+1])
|
||||||
|
}
|
||||||
|
|
||||||
|
func HelpMissingVal(flag string) {
|
||||||
|
fmt.Printf("%s needs a value assignment\n", flag)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
16
sort/sort.go
16
sort/sort.go
|
|
@ -1,23 +1,9 @@
|
||||||
package sort
|
package sort
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"flag"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/brtholomy/um/go/flags"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
key flags.Flag = "key"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func Sort(args []string) {
|
func Sort(args []string) {
|
||||||
sortFlags := flag.NewFlagSet("sort", flag.ExitOnError)
|
fmt.Printf("args: %#v\n", args)
|
||||||
sortKey := sortFlags.String(string(key), "", "filename of ordered list to use as key")
|
|
||||||
|
|
||||||
sortFlags.Parse(args)
|
|
||||||
fmt.Println("subcmd sort")
|
|
||||||
fmt.Printf("key: %#v\n", *sortKey)
|
|
||||||
fmt.Printf("args: %#v\n", sortFlags.Args())
|
|
||||||
sortFlags.Usage()
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
87
tag/tag.go
87
tag/tag.go
|
|
@ -2,62 +2,49 @@ package tag
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
|
||||||
"strings"
|
"github.com/brtholomy/um/go/flags"
|
||||||
"unicode"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var opts struct {
|
type options struct {
|
||||||
Query string `name:"query" help:"tag query"`
|
query flags.Arg
|
||||||
Invert bool `name:"invert" help:"invert match"`
|
date flags.Flag
|
||||||
|
invert flags.FlagBool
|
||||||
}
|
}
|
||||||
|
|
||||||
func flagToField(flag string) string {
|
func InitOpts() options {
|
||||||
s := strings.TrimPrefix(flag, "--")
|
return options{
|
||||||
r := []rune(s)
|
flags.Arg{"", "tag query"},
|
||||||
r[0] = unicode.ToUpper(r[0])
|
flags.Flag{"--date", "-d", "", "date range"},
|
||||||
return string(r)
|
flags.FlagBool{"--invert", "-i", false, "invert match"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseArgs(args []string) options {
|
||||||
|
opts := InitOpts()
|
||||||
|
if len(args) == 0 {
|
||||||
|
return opts
|
||||||
|
}
|
||||||
|
if flags.HasDashPrefix(args[0]) {
|
||||||
|
opts.query.Val = args[0]
|
||||||
|
}
|
||||||
|
for i, arg := range args {
|
||||||
|
switch arg {
|
||||||
|
case opts.invert.Long, opts.invert.Short:
|
||||||
|
opts.invert.Val = true
|
||||||
|
case opts.date.Long:
|
||||||
|
if flags.MissingValueArg(args, i) {
|
||||||
|
flags.HelpMissingVal(arg)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
opts.date.Val = args[i+1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return opts
|
||||||
}
|
}
|
||||||
|
|
||||||
func Tag(args []string) {
|
func Tag(args []string) {
|
||||||
|
fmt.Printf("args: %#v\n", args)
|
||||||
// reflection!
|
opts := ParseArgs(args)
|
||||||
t := reflect.TypeOf(opts)
|
|
||||||
field := reflect.StructField{}
|
|
||||||
found := false
|
|
||||||
for _, a := range args {
|
|
||||||
field, found = t.FieldByName(flagToField(a))
|
|
||||||
if !found {
|
|
||||||
fmt.Printf("%s not found in opts\n", a)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tag := field.Tag
|
|
||||||
|
|
||||||
fmt.Printf("field name: %#v\n", tag.Get("name"))
|
|
||||||
fmt.Printf("field help: %#v\n", tag.Get("help"))
|
|
||||||
|
|
||||||
v := reflect.ValueOf(opts)
|
|
||||||
vfield := reflect.Value{}
|
|
||||||
for _, a := range args {
|
|
||||||
vfield = v.FieldByName(flagToField(a))
|
|
||||||
if vfield.IsValid() && vfield.CanSet() && vfield.Kind() == reflect.Bool {
|
|
||||||
vfield.SetBool(true)
|
|
||||||
fmt.Printf("vfield: %#v\n", vfield)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fmt.Printf("vfield: %#v\n", vfield)
|
|
||||||
fmt.Printf("opts: %#v\n", opts)
|
fmt.Printf("opts: %#v\n", opts)
|
||||||
// for i := 0; i < t.NumField(); i++ {
|
|
||||||
// field := t.Field(i)
|
|
||||||
// if alias, ok := field.Tag.Lookup("name"); ok {
|
|
||||||
// if alias == "" {
|
|
||||||
// fmt.Println("(blank)")
|
|
||||||
// } else {
|
|
||||||
// fmt.Println(alias)
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// fmt.Println("(not specified)")
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue