Add support for UintSlice and Float64Slice flags

This commit is contained in:
Nicolas Maurice 2025-04-11 17:06:26 +02:00 committed by Márk Sági-Kazár
parent 7328d1b53a
commit 260b8e9a3c
2 changed files with 53 additions and 0 deletions

View file

@ -1181,11 +1181,26 @@ func (v *Viper) find(lcaseKey string, flagDefault bool) any {
s = strings.TrimSuffix(s, "]")
res, _ := readAsCSV(s)
return res
case "boolSlice":
s := strings.TrimPrefix(flag.ValueString(), "[")
s = strings.TrimSuffix(s, "]")
res, _ := readAsCSV(s)
return cast.ToBoolSlice(res)
case "intSlice":
s := strings.TrimPrefix(flag.ValueString(), "[")
s = strings.TrimSuffix(s, "]")
res, _ := readAsCSV(s)
return cast.ToIntSlice(res)
case "uintSlice":
s := strings.TrimPrefix(flag.ValueString(), "[")
s = strings.TrimSuffix(s, "]")
res, _ := readAsCSV(s)
return cast.ToUintSlice(res)
case "float64Slice":
s := strings.TrimPrefix(flag.ValueString(), "[")
s = strings.TrimSuffix(s, "]")
res, _ := readAsCSV(s)
return cast.ToFloat64Slice(res)
case "durationSlice":
s := strings.TrimPrefix(flag.ValueString(), "[")
s = strings.TrimSuffix(s, "]")
@ -1268,11 +1283,26 @@ func (v *Viper) find(lcaseKey string, flagDefault bool) any {
s = strings.TrimSuffix(s, "]")
res, _ := readAsCSV(s)
return res
case "boolSlice":
s := strings.TrimPrefix(flag.ValueString(), "[")
s = strings.TrimSuffix(s, "]")
res, _ := readAsCSV(s)
return cast.ToBoolSlice(res)
case "intSlice":
s := strings.TrimPrefix(flag.ValueString(), "[")
s = strings.TrimSuffix(s, "]")
res, _ := readAsCSV(s)
return cast.ToIntSlice(res)
case "uintSlice":
s := strings.TrimPrefix(flag.ValueString(), "[")
s = strings.TrimSuffix(s, "]")
res, _ := readAsCSV(s)
return cast.ToUintSlice(res)
case "float64Slice":
s := strings.TrimPrefix(flag.ValueString(), "[")
s = strings.TrimSuffix(s, "]")
res, _ := readAsCSV(s)
return cast.ToFloat64Slice(res)
case "stringToString":
return stringToStringConv(flag.ValueString())
case "stringToInt":

View file

@ -1210,6 +1210,29 @@ func TestBindPFlagsStringArray(t *testing.T) {
}
}
func TestBindPFlagsSlices(t *testing.T) {
set := pflag.NewFlagSet("test", pflag.ContinueOnError)
set.IntSlice("intslice", []int{}, "")
set.BoolSlice("boolslice", []bool{}, "")
set.Float64Slice("float64slice", []float64{}, "")
set.UintSlice("uintslice", []uint{}, "")
v := New()
v.BindPFlags(set)
set.Set("intslice", "1,2")
assert.Equal(t, []int{1, 2}, v.Get("intslice"))
set.Set("boolslice", "true,false")
assert.Equal(t, []bool{true, false}, v.Get("boolslice"))
set.Set("float64slice", "1.1,2.2")
assert.Equal(t, []float64{1.1, 2.2}, v.Get("float64slice"))
set.Set("uintslice", "1,2")
assert.Equal(t, []uint{1, 2}, v.Get("uintslice"))
}
func TestSliceFlagsReturnCorrectType(t *testing.T) {
flagSet := pflag.NewFlagSet("test", pflag.ContinueOnError)
flagSet.IntSlice("int", []int{1, 2}, "")