blob: 6e46d3480ad606c3351f25072d7c1a1408a1e450 [file] [log] [blame] [edit]
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
package tfdiags
import (
"fmt"
"strings"
"github.com/zclconf/go-cty/cty"
)
// ObjectToString is a helper function that converts a go-cty object to a string representation
func ObjectToString(obj cty.Value) string {
if obj.IsNull() {
return "<null>"
}
if !obj.IsWhollyKnown() {
return "<unknown>"
}
if obj.Type().IsObjectType() && len(obj.Type().AttributeTypes()) == 0 {
return "<empty>"
}
if obj.Type().IsObjectType() {
result := ""
it := obj.ElementIterator()
for it.Next() {
key, val := it.Element()
keyStr := key.AsString()
if result != "" {
result += ","
}
if val.IsNull() {
result += fmt.Sprintf("%s=<null>", keyStr)
continue
}
switch val.Type() {
case cty.Bool:
result += fmt.Sprintf("%s=%t", keyStr, val.True())
case cty.Number:
result += fmt.Sprintf("%s=%s", keyStr, val.AsBigFloat().String())
case cty.String:
result += fmt.Sprintf("%s=%s", keyStr, val.AsString())
case cty.List(cty.Bool):
elements := val.AsValueSlice()
parts := make([]string, len(elements))
for i, element := range elements {
parts[i] = fmt.Sprintf("%t", element.True())
}
result += fmt.Sprintf("%s=[%s]", keyStr, strings.Join(parts, ","))
case cty.List(cty.Number):
elements := val.AsValueSlice()
parts := make([]string, len(elements))
for i, element := range elements {
parts[i] = element.AsBigFloat().String()
}
result += fmt.Sprintf("%s=[%s]", keyStr, strings.Join(parts, ","))
case cty.List(cty.String):
elements := val.AsValueSlice()
parts := make([]string, len(elements))
for i, element := range elements {
parts[i] = element.AsString()
}
result += fmt.Sprintf("%s=[%s]", keyStr, strings.Join(parts, ","))
}
}
return result
}
panic("not an object")
}