Skip to content

Commit 4a50fff

Browse files
committed
fix(requestflag): inspect underlying type in PostParse for empty string and bool env var handling
1 parent 18663c1 commit 4a50fff

2 files changed

Lines changed: 30 additions & 2 deletions

File tree

‎internal/requestflag/requestflag.go‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -305,14 +305,16 @@ func (f *Flag[T]) PreParse() error {
305305
func (f *Flag[T]) PostParse() error {
306306
if !f.hasBeenSet {
307307
if val, source, found := f.Sources.LookupWithSource(); found {
308-
if val != "" || reflect.TypeOf(f.value).Kind() == reflect.String {
308+
tKind := reflect.TypeFor[T]().Kind()
309+
isString := tKind == reflect.String || (tKind == reflect.Pointer && reflect.TypeFor[T]().Elem().Kind() == reflect.String)
310+
if val != "" || isString {
309311
if err := f.Set(f.Name, val); err != nil {
310312
return fmt.Errorf(
311313
"could not parse %[1]q as %[2]T value from %[3]s for flag %[4]s: %[5]s",
312314
val, f.value, source, f.Name, err,
313315
)
314316
}
315-
} else if val == "" && reflect.TypeOf(f.value).Kind() == reflect.Bool {
317+
} else if val == "" && f.IsBoolFlag() {
316318
_ = f.Set(f.Name, "false")
317319
}
318320

‎internal/requestflag/requestflag_test.go‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,3 +1225,29 @@ func TestApplyStdinDataToFlags(t *testing.T) {
12251225
assert.False(t, flag.IsSet())
12261226
})
12271227
}
1228+
1229+
func TestFlagPostParse_EnvVars(t *testing.T) {
1230+
t.Run("string flag with empty env var", func(t *testing.T) {
1231+
t.Setenv("TEST_EMPTY_STR", "")
1232+
flag := &Flag[string]{
1233+
Name: "str-flag",
1234+
Sources: cli.EnvVars("TEST_EMPTY_STR"),
1235+
}
1236+
assert.NoError(t, flag.PreParse())
1237+
assert.NoError(t, flag.PostParse())
1238+
assert.True(t, flag.IsSet())
1239+
assert.Equal(t, "", flag.Get())
1240+
})
1241+
1242+
t.Run("bool flag with empty env var", func(t *testing.T) {
1243+
t.Setenv("TEST_EMPTY_BOOL", "")
1244+
flag := &Flag[bool]{
1245+
Name: "bool-flag",
1246+
Sources: cli.EnvVars("TEST_EMPTY_BOOL"),
1247+
}
1248+
assert.NoError(t, flag.PreParse())
1249+
assert.NoError(t, flag.PostParse())
1250+
assert.True(t, flag.IsSet())
1251+
assert.Equal(t, false, flag.Get())
1252+
})
1253+
}

0 commit comments

Comments
 (0)