um/tag/tag.go

50 lines
1.1 KiB
Go

package tag
import (
"log"
"github.com/brtholomy/um/go/flags"
)
type options struct {
Query flags.Arg
Date flags.Flag[string]
Invert flags.Flag[bool]
Help flags.Flag[bool]
}
func initOpts() options {
return options{
flags.Arg{"", "tag query"},
flags.Flag[string]{"--date", "-d", "", "date range"},
flags.Flag[bool]{"--invert", "-i", false, "invert match"},
flags.Flag[bool]{"--help", "-h", false, "show help"},
}
}
func parseArgs(args []string) options {
opts := initOpts()
for i, arg := range args {
switch {
case i == 0 && !flags.HasDashPrefix(arg):
opts.Query.Val = arg
case arg == opts.Invert.Long || arg == opts.Invert.Short:
opts.Invert.Val = true
case arg == opts.Date.Long || arg == opts.Date.Short:
// TODO: should we use reflection here for a general Valid(arg, opts.Field)?
flags.ValidValueOrExit(args, i)
opts.Date.Val = args[i+1]
case arg == opts.Help.Long || arg == opts.Help.Short:
flags.Help("tag", opts)
default:
log.Println("um tag: invalid argument")
flags.Help("tag", opts)
}
}
return opts
}
func Tag(args []string) {
opts := parseArgs(args)
log.Println(opts)
}