From 36506509f1bf484cd7570bada63e6b90f1b1173d Mon Sep 17 00:00:00 2001 From: Alec Thomas Date: Wed, 20 Jun 2018 22:45:34 +1000 Subject: [PATCH] Better error reporting for short flags. --- _examples/shell/main.go | 4 ++-- context.go | 13 ++++++------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/_examples/shell/main.go b/_examples/shell/main.go index 6998562..c6adb52 100644 --- a/_examples/shell/main.go +++ b/_examples/shell/main.go @@ -25,8 +25,8 @@ var cli struct { func main() { cmd := kong.Parse(&cli, kong.Description("A shell-like example app."), kong.HelpOptions(kong.CompactHelp())) switch cmd { - case "rm": - fmt.Println(cli.Rm.Paths, cli.Rm.Force) + case "rm ": + fmt.Println(cli.Rm.Paths, cli.Rm.Force, cli.Rm.Recursive) case "ls": } diff --git a/context.go b/context.go index 2d8051e..3f22df7 100644 --- a/context.go +++ b/context.go @@ -258,12 +258,12 @@ func (c *Context) trace(node *Node) (err error) { // nolint: gocyclo c.scan.PushTyped(token.Value[0:1], ShortFlagToken) 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 } 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 } @@ -404,14 +404,13 @@ func (c *Context) Apply() (string, error) { 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) - token := c.scan.Peek() for _, flag := range flags { - // Found a matching flag. - if !matcher(flag) { + if "-"+string(flag.Short) != match && "--"+flag.Name != match { continue } + // Found a matching flag. c.scan.Pop() err := flag.Parse(c.scan, c.getValue(flag.Value)) 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}) return nil } - return fmt.Errorf("unknown flag --%s", token.Value) + return fmt.Errorf("unknown flag %s", match) } func checkMissingFlags(flags []*Flag) error {