Make Viper.Sub() inherit values from the bound pflags of the parent

Sub creates a new instance from a sub-tree, but bound flags
are not passed down to the new instance. This commit adds
the bound flags that are prefixed as the provided k to the
new instance.
This commit is contained in:
Blagoj Atanasovski 2020-03-12 19:11:58 +01:00
parent 97ee7adfef
commit 077606a41f
2 changed files with 40 additions and 4 deletions

View file

@ -780,11 +780,21 @@ func (v *Viper) Sub(key string) *Viper {
return nil return nil
} }
if reflect.TypeOf(data).Kind() == reflect.Map { if !(reflect.TypeOf(data).Kind() == reflect.Map) {
subv.config = cast.ToStringMap(data)
return subv
}
return nil return nil
}
subv.config = cast.ToStringMap(data)
subPFlags := make(map[string]FlagValue)
for flagName, flagValue := range v.pflags {
keyPrefix := key + "."
if !strings.HasPrefix(flagName, keyPrefix) {
continue
}
newFlagName := flagName[len(keyPrefix):]
subPFlags[newFlagName] = flagValue
}
subv.pflags = subPFlags
return subv
} }
// GetString returns the value associated with the key as a string. // GetString returns the value associated with the key as a string.

View file

@ -1253,6 +1253,32 @@ func TestSub(t *testing.T) {
assert.Equal(t, (*Viper)(nil), subv) assert.Equal(t, (*Viper)(nil), subv)
} }
func TestSubWithBoundedFlags(t *testing.T) {
v := New()
v.SetConfigType("yaml")
v.ReadConfig(bytes.NewBuffer(yamlExample))
overridenValue := "notSoLarge"
flags := pflag.NewFlagSet("test", pflag.ContinueOnError)
flags.String("clothing.pants.size", "", "")
assert.NoError(t, flags.Parse([]string{"--clothing.pants.size=" + overridenValue}))
v.BindPFlags(flags)
subv := v.Sub("clothing")
assert.Equal(t, overridenValue, v.Get("clothing.pants.size"))
assert.Equal(t, overridenValue, subv.Get("pants.size"))
assert.Equal(t, v.Get("clothing.pants.size"), subv.Get("pants.size"))
subv = v.Sub("clothing.pants")
assert.Equal(t, v.Get("clothing.pants.size"), subv.Get("size"))
subv = v.Sub("clothing.pants.size")
assert.Equal(t, (*Viper)(nil), subv)
subv = v.Sub("missing.key")
assert.Equal(t, (*Viper)(nil), subv)
}
var hclWriteExpected = []byte(`"foos" = { var hclWriteExpected = []byte(`"foos" = {
"foo" = { "foo" = {
"key" = 1 "key" = 1