in internal/template/template.go [146:176]
func FlattenData(src map[string]interface{}, fis []*FlattenInfo) (map[string]interface{}, error) {
res := make(map[string]interface{})
for _, fi := range fis {
v := get(src, fi.Key)
if v == nil {
v = get(res, fi.Key) // This allows you to flatten inner keys
if v == nil {
return nil, fmt.Errorf("flatten key %q not found in data: %v", fi.Key, src)
}
}
delete(src, fi.Key)
// If index is set assume value is a list and the index is being flattened.
if i := fi.Index; i != nil {
vs := v.([]interface{})
if *i >= len(vs) {
return nil, fmt.Errorf("flatten index for key %q out of range: got %v, want value between 0 and %v", fi.Key, fi.Index, len(vs))
}
v = vs[*i]
}
m, ok := v.(map[string]interface{})
if !ok {
return nil, fmt.Errorf("flatten key %q is not a map, got type %T, value %v", fi.Key, v, v)
}
if err := MergeData(res, m); err != nil {
return nil, err
}
}
return res, nil
}