From 93f1be46b4ec9ecea5a935bb4583e745041c03a9 Mon Sep 17 00:00:00 2001 From: Benoit Masson Date: Wed, 12 Oct 2016 22:38:58 +0200 Subject: [PATCH] Fixed: insensitiviseMaps and tests All keys (even nested ones) are now lower-cased recursively. On the way, map[interface{}]interface{} are cast to map[string]interface{} --- util.go | 18 +++++++++++++----- viper_test.go | 10 +++++----- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/util.go b/util.go index b0903fb..aec8a99 100644 --- a/util.go +++ b/util.go @@ -41,15 +41,23 @@ func (pe ConfigParseError) Error() string { func insensitiviseMap(m map[string]interface{}) { for key, val := range m { + switch val.(type) { + case map[interface{}]interface{}: + // nested map: cast and recursively insensitivise + val = cast.ToStringMap(val) + insensitiviseMap(val.(map[string]interface{})) + case map[string]interface{}: + // nested map: recursively insensitivise + insensitiviseMap(val.(map[string]interface{})) + } + lower := strings.ToLower(key) if key != lower { + // remove old key (not lower-cased) delete(m, key) - m[lower] = val - if m2, ok := val.(map[string]interface{}); ok { - // nested map: recursively insensitivise - insensitiviseMap(m2) - } } + // update map + m[lower] = val } } diff --git a/viper_test.go b/viper_test.go index 963c3ce..81c6333 100644 --- a/viper_test.go +++ b/viper_test.go @@ -269,7 +269,7 @@ func TestUnmarshalling(t *testing.T) { assert.False(t, InConfig("state")) assert.Equal(t, "steve", Get("name")) assert.Equal(t, []interface{}{"skateboarding", "snowboarding", "go"}, Get("hobbies")) - assert.Equal(t, map[string]interface{}{"jacket": "leather", "trousers": "denim", "pants": map[interface{}]interface{}{"size": "large"}}, Get("clothing")) + assert.Equal(t, map[string]interface{}{"jacket": "leather", "trousers": "denim", "pants": map[string]interface{}{"size": "large"}}, Get("clothing")) assert.Equal(t, 35, Get("age")) } @@ -637,10 +637,10 @@ func TestFindsNestedKeys(t *testing.T) { "age": 35, "owner": map[string]interface{}{ "organization": "MongoDB", - "Bio": "MongoDB Chief Developer Advocate & Hacker at Large", + "bio": "MongoDB Chief Developer Advocate & Hacker at Large", "dob": dob, }, - "owner.Bio": "MongoDB Chief Developer Advocate & Hacker at Large", + "owner.bio": "MongoDB Chief Developer Advocate & Hacker at Large", "type": "donut", "id": "0001", "name": "Cake", @@ -649,7 +649,7 @@ func TestFindsNestedKeys(t *testing.T) { "clothing": map[string]interface{}{ "jacket": "leather", "trousers": "denim", - "pants": map[interface{}]interface{}{ + "pants": map[string]interface{}{ "size": "large", }, }, @@ -695,7 +695,7 @@ func TestReadBufConfig(t *testing.T) { assert.False(t, v.InConfig("state")) assert.Equal(t, "steve", v.Get("name")) assert.Equal(t, []interface{}{"skateboarding", "snowboarding", "go"}, v.Get("hobbies")) - assert.Equal(t, map[string]interface{}{"jacket": "leather", "trousers": "denim", "pants": map[interface{}]interface{}{"size": "large"}}, v.Get("clothing")) + assert.Equal(t, map[string]interface{}{"jacket": "leather", "trousers": "denim", "pants": map[string]interface{}{"size": "large"}}, v.Get("clothing")) assert.Equal(t, 35, v.Get("age")) }