diff --git a/util.go b/util.go index 76b147f..df1c71a 100644 --- a/util.go +++ b/util.go @@ -66,21 +66,30 @@ func copyAndInsensitiviseMap(m map[string]interface{}) map[string]interface{} { return nm } -func insensitiviseMap(m map[string]interface{}) { +func insensitiviseMap(m map[string]interface{}) error { 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{})) + err := insensitiviseMap(val.(map[string]interface{})) + if err != nil { + return err + } case map[string]interface{}: // nested map: recursively insensitivise - insensitiviseMap(val.(map[string]interface{})) + err := insensitiviseMap(val.(map[string]interface{})) + if err != nil { + return err + } case []interface{}: for _, x := range val.([]interface{}) { y, ok := x.(map[string]interface{}) if ok { - insensitiviseMap(y) + err := insensitiviseMap(y) + if err != nil { + return err + } } } } @@ -90,9 +99,17 @@ func insensitiviseMap(m map[string]interface{}) { // remove old key (not lower-cased) delete(m, key) } + + _, exists := m[lower] + if key != lower && exists { + return fmt.Errorf("Name clash bewteen keys: %s and %s", key, lower) + } + // update map m[lower] = val } + + return nil } func absPathify(inPath string) string { diff --git a/viper.go b/viper.go index ca02fa6..477ef74 100644 --- a/viper.go +++ b/viper.go @@ -753,7 +753,10 @@ func (v *Viper) UnmarshalKey(key string, rawVal interface{}) error { return err } - v.insensitiviseMaps() + err = v.insensitiviseMaps() + if err != nil { + return err + } return nil } @@ -768,7 +771,10 @@ func (v *Viper) Unmarshal(rawVal interface{}) error { return err } - v.insensitiviseMaps() + err = v.insensitiviseMaps() + if err != nil { + return err + } return nil } @@ -808,7 +814,10 @@ func (v *Viper) UnmarshalExact(rawVal interface{}) error { return err } - v.insensitiviseMaps() + err = v.insensitiviseMaps() + if err != nil { + return err + } return nil } @@ -1332,7 +1341,10 @@ func (v *Viper) unmarshalReader(in io.Reader, c map[string]interface{}) error { } } - insensitiviseMap(c) + err := insensitiviseMap(c) + if err != nil { + return err + } return nil } @@ -1514,11 +1526,20 @@ func (v *Viper) WatchRemoteConfigOnChannel() error { return v.watchKeyValueConfigOnChannel() } -func (v *Viper) insensitiviseMaps() { - insensitiviseMap(v.config) - insensitiviseMap(v.defaults) - insensitiviseMap(v.override) - insensitiviseMap(v.kvstore) +func (v *Viper) insensitiviseMaps() error { + if err := insensitiviseMap(v.config); err != nil { + return err + } + if err := insensitiviseMap(v.defaults); err != nil { + return err + } + if err := insensitiviseMap(v.override); err != nil { + return err + } + if err := insensitiviseMap(v.kvstore); err != nil { + return err + } + return nil } // Retrieve the first found remote configuration.