func ToCtyValue()

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
	}
}