in safemapstr/safemapstr.go [58:102]
func mapFind(data mapstr.M, key, alternativeKey string) (subMap mapstr.M, subKey string) {
// XXX This implementation mimics `common.mapFind`, both should be updated to have similar behavior
for {
if oldValue, exists := data[key]; exists {
if oldMap, ok := tryToM(oldValue); ok {
return oldMap, alternativeKey
}
return data, key
}
idx := strings.IndexRune(key, '.')
if idx < 0 {
// if old value exists and is a dictionary, return the old dictionary and
// make sure we store the new value using the 'alternativeKey'
if oldValue, exists := data[key]; exists {
if oldMap, ok := tryToM(oldValue); ok {
return oldMap, alternativeKey
}
}
return data, key
}
// Check if first sub-key exists. Create an intermediate map if not.
k := key[:idx]
d, exists := data[k]
if !exists {
d = mapstr.M{}
data[k] = d
}
// store old value under 'alternativeKey' if the old value is no map.
// Do not overwrite old value.
v, ok := tryToM(d)
if !ok {
v = mapstr.M{alternativeKey: d}
data[k] = v
}
// advance into sub-map
key = key[idx+1:]
data = v
}
}