Better error reporting for short flags.
This commit is contained in:
@@ -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
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user