func FlattenData()

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
}