Add proper handling of flag.StringSlice

This commit is contained in:
Paweł Szczur 2017-01-04 10:52:07 +01:00
parent 5ed0fc31f7
commit 5d9cb36f40
2 changed files with 30 additions and 2 deletions

View file

@ -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()
}

View file

@ -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)