diff --git a/internal/requestflag/requestflag.go b/internal/requestflag/requestflag.go index 77c4f1f..a58c672 100644 --- a/internal/requestflag/requestflag.go +++ b/internal/requestflag/requestflag.go @@ -305,14 +305,16 @@ func (f *Flag[T]) PreParse() error { func (f *Flag[T]) PostParse() error { if !f.hasBeenSet { if val, source, found := f.Sources.LookupWithSource(); found { - if val != "" || reflect.TypeOf(f.value).Kind() == reflect.String { + tKind := reflect.TypeFor[T]().Kind() + isString := tKind == reflect.String || (tKind == reflect.Pointer && reflect.TypeFor[T]().Elem().Kind() == reflect.String) + if val != "" || isString { 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 if val == "" && reflect.TypeOf(f.value).Kind() == reflect.Bool { + } else if val == "" && f.IsBoolFlag() { _ = f.Set(f.Name, "false") } diff --git a/internal/requestflag/requestflag_test.go b/internal/requestflag/requestflag_test.go index 779bd57..5315844 100644 --- a/internal/requestflag/requestflag_test.go +++ b/internal/requestflag/requestflag_test.go @@ -1225,3 +1225,29 @@ func TestApplyStdinDataToFlags(t *testing.T) { assert.False(t, flag.IsSet()) }) } + +func TestFlagPostParse_EnvVars(t *testing.T) { + t.Run("string flag with empty env var", func(t *testing.T) { + t.Setenv("TEST_EMPTY_STR", "") + flag := &Flag[string]{ + Name: "str-flag", + Sources: cli.EnvVars("TEST_EMPTY_STR"), + } + assert.NoError(t, flag.PreParse()) + assert.NoError(t, flag.PostParse()) + assert.True(t, flag.IsSet()) + assert.Equal(t, "", flag.Get()) + }) + + t.Run("bool flag with empty env var", func(t *testing.T) { + t.Setenv("TEST_EMPTY_BOOL", "") + flag := &Flag[bool]{ + Name: "bool-flag", + Sources: cli.EnvVars("TEST_EMPTY_BOOL"), + } + assert.NoError(t, flag.PreParse()) + assert.NoError(t, flag.PostParse()) + assert.True(t, flag.IsSet()) + assert.Equal(t, false, flag.Get()) + }) +}