This commit is contained in:
Blagoj Atanasovski 2023-02-10 06:50:47 +09:00 committed by GitHub
commit edb998aaed
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 40 additions and 4 deletions

View file

@ -947,11 +947,21 @@ func (v *Viper) Sub(key string) *Viper {
return nil
}
if reflect.TypeOf(data).Kind() == reflect.Map {
subv.config = cast.ToStringMap(data)
return subv
if !(reflect.TypeOf(data).Kind() == reflect.Map) {
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.

View file

@ -1524,6 +1524,32 @@ func TestSub(t *testing.T) {
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" = {
"foo" = {
"key" = 1