From 454f2c067ef7c13a4ce665f73d515a39d710b4a2 Mon Sep 17 00:00:00 2001 From: Joe Schmitt Date: Thu, 18 Feb 2021 11:38:31 -0500 Subject: [PATCH] Add test case for inverting the negation Not sure why anyone would do this, but it's covered now. --- README.md | 2 +- context.go | 10 ++++++---- kong_test.go | 13 +++++++++++++ 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index ba040c0..78341a1 100644 --- a/README.md +++ b/README.md @@ -440,7 +440,7 @@ Tag | Description `required` | If present, flag/arg is required. `optional` | If present, flag/arg is optional. `hidden` | If present, command or flag is hidden. -`negatable` | If present on a `bool` field, supports prefixing a flag with `--no-` to set flag to `false` +`negatable` | If present on a `bool` field, supports prefixing a flag with `--no-` to invert the default value `format:"X"` | Format for parsing input, if supported. `sep:"X"` | Separator for sequences (defaults to ","). May be `none` to disable splitting. `mapsep:"X"` | Separator for maps (defaults to ";"). May be `none` to disable splitting. diff --git a/context.go b/context.go index 2c9b791..dcf754a 100644 --- a/context.go +++ b/context.go @@ -579,9 +579,6 @@ func (c *Context) getValue(value *Value) reflect.Value { } c.values[value] = v } - if value.Flag != nil && value.Flag.Negated { - v.SetBool(false) - } return v } @@ -629,7 +626,12 @@ func (c *Context) Apply() (string, error) { panic("unsupported path ?!") } if value != nil { - value.Apply(c.getValue(value)) + v := c.getValue(value) + if value.Flag != nil && value.Flag.Negated { + v.SetBool(!v.Bool()) + } + + value.Apply(v) } } diff --git a/kong_test.go b/kong_test.go index b7c598f..a25bee2 100644 --- a/kong_test.go +++ b/kong_test.go @@ -369,6 +369,19 @@ func TestNegatedBooleanFlag(t *testing.T) { require.Equal(t, false, cli.Cmd.Flag) } +func TestInvertedNegatedBooleanFlag(t *testing.T) { + var cli struct { + Cmd struct { + Flag bool `kong:"default='true',negatable"` + } `kong:"cmd"` + } + + p := mustNew(t, &cli) + _, err := p.Parse([]string{"cmd", "--no-flag=false"}) + require.NoError(t, err) + require.Equal(t, true, cli.Cmd.Flag) +} + func TestInvalidNegatedNonBool(t *testing.T) { var cli struct { Cmd struct {