in cty.go [12:68]
func ToCtyValue(input any) cty.Value {
if v, isCtyValue := input.(cty.Value); isCtyValue {
return v
}
val := reflect.ValueOf(input)
switch val.Kind() {
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
return cty.NumberIntVal(val.Int())
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
return cty.NumberUIntVal(val.Uint())
case reflect.Float32, reflect.Float64:
return cty.NumberFloatVal(val.Float())
case reflect.String:
return cty.StringVal(val.String())
case reflect.Bool:
return cty.BoolVal(val.Bool())
case reflect.Slice:
if val.Len() == 0 {
sliceType := reflect.TypeOf(input)
return cty.ListValEmpty(GoTypeToCtyType(sliceType.Elem()))
}
var vals []cty.Value
for i := 0; i < val.Len(); i++ {
vals = append(vals, ToCtyValue(val.Index(i).Interface()))
}
return cty.ListVal(vals)
case reflect.Map:
if val.Len() == 0 {
mapType := reflect.TypeOf(input)
elementType := mapType.Elem()
return cty.MapValEmpty(GoTypeToCtyType(elementType))
}
vals := make(map[string]cty.Value)
iter := val.MapRange()
for iter.Next() {
key := iter.Key().String()
vals[key] = ToCtyValue(iter.Value().Interface())
}
return cty.MapVal(vals)
case reflect.Struct:
vals := make(map[string]cty.Value)
for i := 0; i < val.NumField(); i++ {
fn, _ := fieldName(val.Type().Field(i))
fv := val.Field(i)
vals[fn] = ToCtyValue(fv.Interface())
}
return cty.ObjectVal(vals)
case reflect.Ptr:
if val.IsNil() {
return cty.NilVal
}
return ToCtyValue(val.Elem().Interface())
default:
return cty.NilVal
}
}