diff --git a/viper.go b/viper.go index 30ae4aa..ed4c1af 100644 --- a/viper.go +++ b/viper.go @@ -858,6 +858,28 @@ func (v *Viper) Sub(key string) *Viper { return nil } +// SubSlice returns a slice of new Viper instances representing a sub tree of this instance. +// Sub is case-insensitive for a key. +func SubSlice(key string) []*Viper { return v.SubSlice(key) } +func (v *Viper) SubSlice(key string) []*Viper { + data := v.Get(key) + if data == nil { + return nil + } + + if reflect.TypeOf(data).Kind() == reflect.Slice { + var vList []*Viper + for _, item := range data.([]interface{}) { + subv := New() + subv.config = cast.ToStringMap(item) + vList = append(vList, subv) + } + return vList + } + + return nil +} + // GetString returns the value associated with the key as a string. func GetString(key string) string { return v.GetString(key) } diff --git a/viper_test.go b/viper_test.go index 2edc83f..0d7bc45 100644 --- a/viper_test.go +++ b/viper_test.go @@ -1800,6 +1800,30 @@ func TestSub(t *testing.T) { assert.Equal(t, []string{"clothing", "pants"}, subv.parents) } +func TestSubSlice(t *testing.T) { + var yamlList = []byte(`map: + foo: bar +list: +- foo: 0 + bar: 0 +- foo: 1 + bar: 1 +`) + + v := New() + v.SetConfigType("yaml") + v.ReadConfig(bytes.NewBuffer(yamlList)) + + subvSlice := v.SubSlice("list") + for idx, subv := range subvSlice { + assert.Equal(t, subv.GetInt("foo"), idx) + assert.Equal(t, subv.GetInt("bar"), idx) + } + + subvSlice = v.SubSlice("map") + assert.Equal(t, ([]*Viper)(nil), subvSlice) +} + var hclWriteExpected = []byte(`"foos" = { "foo" = { "key" = 1