in block.go [165:200]
func Values[T Block](blocks []T) cty.Value {
if len(blocks) == 0 {
return cty.EmptyObjectVal
}
res := map[string]cty.Value{}
valuesMap := map[string]map[string]cty.Value{}
for _, b := range blocks {
values, exists := valuesMap[b.Type()]
if !exists {
values = map[string]cty.Value{}
valuesMap[b.Type()] = values
}
blockVal := blockToCtyValue(b)
forEach := b.getForEach()
if forEach == nil {
values[b.Name()] = blockVal
} else {
m, ok := values[b.Name()]
if !ok {
m = cty.MapValEmpty(cty.EmptyObject)
}
nm := m.AsValueMap()
if nm == nil {
nm = make(map[string]cty.Value)
}
nm[CtyValueToString(forEach.key)] = blockVal
values[b.Name()] = cty.ObjectVal(nm)
}
valuesMap[b.Type()] = values
}
for t, m := range valuesMap {
res[t] = cty.ObjectVal(m)
}
return cty.ObjectVal(res)
}