From ed24960916047b121e1d823f226c3de011bec981 Mon Sep 17 00:00:00 2001 From: Joe Schmitt Date: Wed, 24 Feb 2021 14:13:11 -0500 Subject: [PATCH] Implement code review feedback --- context.go | 2 +- kong_test.go | 15 +++++++++++++++ tag.go | 2 +- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/context.go b/context.go index dcf754a..554e8b1 100644 --- a/context.go +++ b/context.go @@ -649,7 +649,7 @@ func (c *Context) parseFlag(flags []*Flag, match string) (err error) { if flag.Short != 0 { candidates = append(candidates, short) } - if short != match && long != match && neg != match { + if short != match && long != match && !(match == neg && flag.Tag.Negatable) { continue } // Found a matching flag. diff --git a/kong_test.go b/kong_test.go index a25bee2..9163141 100644 --- a/kong_test.go +++ b/kong_test.go @@ -382,6 +382,21 @@ func TestInvertedNegatedBooleanFlag(t *testing.T) { require.Equal(t, true, cli.Cmd.Flag) } +func TestExistingNoFlag(t *testing.T) { + var cli struct { + Cmd struct { + Flag bool `kong:"default='true'"` + NoFlag string + } `kong:"cmd"` + } + + p := mustNew(t, &cli) + _, err := p.Parse([]string{"cmd", "--no-flag=none"}) + require.NoError(t, err) + require.Equal(t, true, cli.Cmd.Flag) + require.Equal(t, "none", cli.Cmd.NoFlag) +} + func TestInvalidNegatedNonBool(t *testing.T) { var cli struct { Cmd struct { diff --git a/tag.go b/tag.go index e4d9af4..deffd86 100644 --- a/tag.go +++ b/tag.go @@ -160,7 +160,7 @@ func parseTag(fv reflect.Value, ft reflect.StructField) *Tag { t.Prefix = t.Get("prefix") t.Embed = t.Has("embed") negatable := t.Has("negatable") - if negatable && ft.Type.Name() != "bool" { + if negatable && ft.Type.Kind() != reflect.Bool { fail("negatable can only be set on booleans") } t.Negatable = negatable