in cty.go [123:160]
func CtyValueToString(val cty.Value) string {
if val.IsNull() && val != cty.NilVal {
return "null"
}
switch val.Type() {
case cty.String:
return val.AsString()
case cty.Number:
bf := val.AsBigFloat()
return bf.Text('f', -1)
case cty.Bool:
return fmt.Sprintf("%t", val.True())
case cty.NilType:
return "nil"
default:
if val.Type().IsListType() || val.Type().IsSetType() || val.Type().IsTupleType() {
strs := make([]string, 0, val.LengthInt())
it := val.ElementIterator()
for it.Next() {
_, v := it.Element()
strs = append(strs, CtyValueToString(v))
}
return "[" + strings.Join(strs, ", ") + "]"
}
if val.Type().IsMapType() || val.Type().IsObjectType() {
strs := make([]string, 0, val.LengthInt())
it := val.ElementIterator()
for it.Next() {
k, v := it.Element()
strs = append(strs, fmt.Sprintf("%s: %s", k.AsString(), CtyValueToString(v)))
}
return "{" + strings.Join(strs, ", ") + "}"
}
// For other types, use the GoString method, which will give a
// string representation of the internal structure of the value.
return val.GoString()
}
}