Skip to content

Commit 5247643

Browse files
awricharsagikazarmark
authored andcommitted
Recurse into arrays when converting keys to lowercase
Fixes #1386 Signed-off-by: Andrew Richardson <andrew.richardson@kaleido.io>
1 parent 98c63ed commit 5247643

File tree

2 files changed

+32
-12
lines changed

2 files changed

+32
-12
lines changed

util.go

+23-10
Original file line numberDiff line numberDiff line change
@@ -64,18 +64,25 @@ func copyAndInsensitiviseMap(m map[string]interface{}) map[string]interface{} {
6464
return nm
6565
}
6666

67+
func insensitiviseVal(val interface{}) interface{} {
68+
switch val.(type) {
69+
case map[interface{}]interface{}:
70+
// nested map: cast and recursively insensitivise
71+
val = cast.ToStringMap(val)
72+
insensitiviseMap(val.(map[string]interface{}))
73+
case map[string]interface{}:
74+
// nested map: recursively insensitivise
75+
insensitiviseMap(val.(map[string]interface{}))
76+
case []interface{}:
77+
// nested array: recursively insensitivise
78+
insensitiveArray(val.([]interface{}))
79+
}
80+
return val
81+
}
82+
6783
func insensitiviseMap(m map[string]interface{}) {
6884
for key, val := range m {
69-
switch val.(type) {
70-
case map[interface{}]interface{}:
71-
// nested map: cast and recursively insensitivise
72-
val = cast.ToStringMap(val)
73-
insensitiviseMap(val.(map[string]interface{}))
74-
case map[string]interface{}:
75-
// nested map: recursively insensitivise
76-
insensitiviseMap(val.(map[string]interface{}))
77-
}
78-
85+
val = insensitiviseVal(val)
7986
lower := strings.ToLower(key)
8087
if key != lower {
8188
// remove old key (not lower-cased)
@@ -86,6 +93,12 @@ func insensitiviseMap(m map[string]interface{}) {
8693
}
8794
}
8895

96+
func insensitiveArray(a []interface{}) {
97+
for i, val := range a {
98+
a[i] = insensitiviseVal(val)
99+
}
100+
}
101+
89102
func absPathify(logger Logger, inPath string) string {
90103
logger.Info("trying to resolve absolute path", "path", inPath)
91104

viper_test.go

+9-2
Original file line numberDiff line numberDiff line change
@@ -2516,7 +2516,10 @@ func TestKeyDelimiter(t *testing.T) {
25162516
}
25172517

25182518
var yamlDeepNestedSlices = []byte(`TV:
2519-
- title: "The expanse"
2519+
- title: "The Expanse"
2520+
title_i18n:
2521+
USA: "The Expanse"
2522+
Japan: "エクスパンス -巨獣めざめる-"
25202523
seasons:
25212524
- first_released: "December 14, 2015"
25222525
episodes:
@@ -2546,11 +2549,15 @@ func TestSliceIndexAccess(t *testing.T) {
25462549
err := v.unmarshalReader(r, v.config)
25472550
require.NoError(t, err)
25482551

2549-
assert.Equal(t, "The expanse", v.GetString("tv.0.title"))
2552+
assert.Equal(t, "The Expanse", v.GetString("tv.0.title"))
25502553
assert.Equal(t, "February 1, 2017", v.GetString("tv.0.seasons.1.first_released"))
25512554
assert.Equal(t, "Static", v.GetString("tv.0.seasons.1.episodes.2.title"))
25522555
assert.Equal(t, "December 15, 2015", v.GetString("tv.0.seasons.0.episodes.1.air_date"))
25532556

2557+
// Test nested keys with capital letters
2558+
assert.Equal(t, "The Expanse", v.GetString("tv.0.title_i18n.USA"))
2559+
assert.Equal(t, "エクスパンス -巨獣めざめる-", v.GetString("tv.0.title_i18n.Japan"))
2560+
25542561
// Test for index out of bounds
25552562
assert.Equal(t, "", v.GetString("tv.0.seasons.2.first_released"))
25562563

0 commit comments

Comments
 (0)