diff --git a/flag_impl.go b/flag_impl.go index 410f7f0875..56941e77e4 100644 --- a/flag_impl.go +++ b/flag_impl.go @@ -155,15 +155,14 @@ func (f *FlagBase[T, C, V]) PostParse() error { continue } - if val != "" || kind == reflect.String { - if err := f.Set(f.Name, val); err != nil { - return fmt.Errorf( - "could not parse %[1]q as %[2]T value from %[3]s for flag %[4]s: %[5]s", - val, f.Value, source, f.Name, err, - ) - } - } else { - _ = f.Set(f.Name, "false") + if val == "" && kind == reflect.Bool { + val = "false" + } + if err := f.Set(f.Name, val); err != nil { + return fmt.Errorf( + "could not parse %[1]q as %[2]T value from %[3]s for flag %[4]s: %[5]s", + val, f.Value, source, f.Name, err, + ) } f.hasBeenSet = true diff --git a/flag_test.go b/flag_test.go index 9dca7de7b8..a699465d3c 100644 --- a/flag_test.go +++ b/flag_test.go @@ -734,6 +734,17 @@ func TestFlagsFromEmptyEnv(t *testing.T) { wantValue: false, wantIsSet: true, }, + { + name: "an empty bool still runs the validator", + env: map[string]string{"DEBUG": ""}, + fl: &BoolFlag{Name: "debug", Value: true, Sources: EnvVars("DEBUG"), Validator: func(b bool) error { + if !b { + return errors.New("debug must be true") + } + return nil + }}, + errContains: "debug must be true", + }, } for _, tc := range testCases {