Better error reporting for short flags.

This commit is contained in:
Alec Thomas
2018-06-20 22:45:34 +10:00
parent 4edc701d63
commit 36506509f1
2 changed files with 8 additions and 9 deletions
+2 -2
View File
@@ -25,8 +25,8 @@ var cli struct {
func main() { func main() {
cmd := kong.Parse(&cli, kong.Description("A shell-like example app."), kong.HelpOptions(kong.CompactHelp())) cmd := kong.Parse(&cli, kong.Description("A shell-like example app."), kong.HelpOptions(kong.CompactHelp()))
switch cmd { switch cmd {
case "rm": case "rm <paths>":
fmt.Println(cli.Rm.Paths, cli.Rm.Force) fmt.Println(cli.Rm.Paths, cli.Rm.Force, cli.Rm.Recursive)
case "ls": case "ls":
} }
+6 -7
View File
@@ -258,12 +258,12 @@ func (c *Context) trace(node *Node) (err error) { // nolint: gocyclo
c.scan.PushTyped(token.Value[0:1], ShortFlagToken) c.scan.PushTyped(token.Value[0:1], ShortFlagToken)
case FlagToken: case FlagToken:
if err := c.matchFlags(flags, func(f *Flag) bool { return f.Name == token.Value }); err != nil { if err := c.parseFlag(flags, "--"+token.Value); err != nil {
return err return err
} }
case ShortFlagToken: case ShortFlagToken:
if err := c.matchFlags(flags, func(f *Flag) bool { return string(f.Short) == token.Value }); err != nil { if err := c.parseFlag(flags, "-"+token.Value); err != nil {
return err return err
} }
@@ -404,14 +404,13 @@ func (c *Context) Apply() (string, error) {
return strings.Join(path, " "), nil return strings.Join(path, " "), nil
} }
func (c *Context) matchFlags(flags []*Flag, matcher func(f *Flag) bool) (err error) { func (c *Context) parseFlag(flags []*Flag, match string) (err error) {
defer catch(&err) defer catch(&err)
token := c.scan.Peek()
for _, flag := range flags { for _, flag := range flags {
// Found a matching flag. if "-"+string(flag.Short) != match && "--"+flag.Name != match {
if !matcher(flag) {
continue continue
} }
// Found a matching flag.
c.scan.Pop() c.scan.Pop()
err := flag.Parse(c.scan, c.getValue(flag.Value)) err := flag.Parse(c.scan, c.getValue(flag.Value))
if err != nil { if err != nil {
@@ -420,7 +419,7 @@ func (c *Context) matchFlags(flags []*Flag, matcher func(f *Flag) bool) (err err
c.Path = append(c.Path, &Path{Flag: flag}) c.Path = append(c.Path, &Path{Flag: flag})
return nil return nil
} }
return fmt.Errorf("unknown flag --%s", token.Value) return fmt.Errorf("unknown flag %s", match)
} }
func checkMissingFlags(flags []*Flag) error { func checkMissingFlags(flags []*Flag) error {