From 4a50fff75769571d323ce8937003491c7f2e7c40 Mon Sep 17 00:00:00 2001 From: Aditya kumar singh <143548997+Adityakk9031@users.noreply.github.com> Date: Tue, 6 Oct 2026 00:12:59 +0530 Subject: [PATCH] fix(requestflag): inspect underlying type in PostParse for empty string and bool env var handling --- internal/requestflag/requestflag.go | 6 ++++-- internal/requestflag/requestflag_test.go | 26 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) 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()) + }) +}