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 {