From 8848d1e0de9edc06293b596809e7763eb8f11c97 Mon Sep 17 00:00:00 2001 From: Nicolas Maurice Date: Fri, 11 Apr 2025 17:06:26 +0200 Subject: [PATCH] Add support for UintSlice and Float64Slice flags --- go.mod | 2 ++ go.sum | 4 ++-- viper.go | 30 ++++++++++++++++++++++++++++++ viper_test.go | 23 +++++++++++++++++++++++ 4 files changed, 57 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 8bc0249..9d8c4ce 100644 --- a/go.mod +++ b/go.mod @@ -25,3 +25,5 @@ require ( golang.org/x/sys v0.29.0 // indirect golang.org/x/text v0.23.0 // indirect ) + +replace github.com/spf13/cast => github.com/nmvalera/cast v0.0.0-20250411145757-fc296861780c diff --git a/go.sum b/go.sum index 83977f3..7854c32 100644 --- a/go.sum +++ b/go.sum @@ -13,6 +13,8 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/nmvalera/cast v0.0.0-20250411145757-fc296861780c h1:Q38/wbtD4Iu93u8yqDdNvsYNAItJ6o9nurM+UJGaUew= +github.com/nmvalera/cast v0.0.0-20250411145757-fc296861780c/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -25,8 +27,6 @@ github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9yS github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA= github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo= -github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= -github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/viper.go b/viper.go index a58d757..e4bdda0 100644 --- a/viper.go +++ b/viper.go @@ -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": diff --git a/viper_test.go b/viper_test.go index f7e0787..e7e262b 100644 --- a/viper_test.go +++ b/viper_test.go @@ -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}, "")