diff --git a/viper.go b/viper.go index 2603c78..137d015 100644 --- a/viper.go +++ b/viper.go @@ -880,7 +880,7 @@ func (v *Viper) find(lcaseKey string) interface{} { return cast.ToBool(flag.ValueString()) case "stringSlice": s := strings.TrimPrefix(flag.ValueString(), "[") - return strings.TrimSuffix(s, "]") + return strings.Split(strings.TrimSuffix(s, "]"), ",") default: return flag.ValueString() } @@ -947,7 +947,7 @@ func (v *Viper) find(lcaseKey string) interface{} { return cast.ToBool(flag.ValueString()) case "stringSlice": s := strings.TrimPrefix(flag.ValueString(), "[") - return strings.TrimSuffix(s, "]") + return strings.Split(strings.TrimSuffix(s, "]"), ",") default: return flag.ValueString() } diff --git a/viper_test.go b/viper_test.go index cd7b65c..e928af5 100644 --- a/viper_test.go +++ b/viper_test.go @@ -538,6 +538,34 @@ func TestBindPFlags(t *testing.T) { } +func TestBindPFlagsStringSlice(t *testing.T) { + for _, testValue := range [][]string{nil, []string{}, []string{"jeden"}, []string{"dwa", "trzy"}} { + v := New() // create independent Viper object + flagSet := pflag.NewFlagSet("test", pflag.ContinueOnError) + flagSet.StringSlice("stringslice", testValue, "test") + flagSet.Visit(func(f *pflag.Flag) { + if len(testValue) > 0 { + f.Value.Set(strings.Join(testValue, ",")) + f.Changed = true + } + }) + + err := v.BindPFlags(flagSet) + if err != nil { + t.Fatalf("error binding flag set, %v", err) + } + + type TestStr struct { + StringSlice []string + } + val := &TestStr{} + if err := v.Unmarshal(val); err != nil { + t.Fatalf("%+#v cannot unmarshal: %s", testValue, err) + assert.Equal(t, val.StringSlice, testValue) + } + } +} + func TestBindPFlag(t *testing.T) { var testString = "testing" var testValue = newStringValue(testString, &testString)