package plugin import ( "github.com/zclconf/go-cty/cty" commonv1 "code.icb4dc0.de/buildr/api/generated/common/v1" ) func unwrap(val cty.Value) *commonv1.ModuleSpec_Value { switch { case val.Type().Equals(cty.String): return &commonv1.ModuleSpec_Value{ Type: commonv1.ModuleSpec_ValueTypeSingle, SingleValue: &commonv1.ModuleSpec_Value_StringValue{ StringValue: val.AsString(), }, } case val.Type().Equals(cty.Bool): return &commonv1.ModuleSpec_Value{ Type: commonv1.ModuleSpec_ValueTypeSingle, SingleValue: &commonv1.ModuleSpec_Value_BoolValue{ BoolValue: val.True(), }, } case val.Type().Equals(cty.Number): f, _ := val.AsBigFloat().Float64() return &commonv1.ModuleSpec_Value{ Type: commonv1.ModuleSpec_ValueTypeSingle, SingleValue: &commonv1.ModuleSpec_Value_DoubleValue{ DoubleValue: f, }, } case val.Type().IsTupleType(): //nolint:gocritic // eventually, there will be more cases switch { case val.Type().TupleElementTypes()[0].Equals(cty.String): specVal := &commonv1.ModuleSpec_Value{ Type: commonv1.ModuleSpec_ValueTypeStringSlice, } for _, v := range val.AsValueSlice() { specVal.StringValues = append(specVal.StringValues, v.AsString()) } return specVal } case val.Type().IsMapType(): valueMap := val.AsValueMap() specVal := &commonv1.ModuleSpec_Value{ Type: commonv1.ModuleSpec_ValueTypeMap, ComplexValue: make(map[string]*commonv1.ModuleSpec_Value, len(valueMap)), } //nolint:gocritic // eventually, there will be more cases switch { case val.Type().MapElementType().Equals(cty.String): for k, v := range valueMap { specVal.ComplexValue[k] = &commonv1.ModuleSpec_Value{ Type: commonv1.ModuleSpec_ValueTypeSingle, SingleValue: &commonv1.ModuleSpec_Value_StringValue{ StringValue: v.AsString(), }, } } } return specVal case val.Type().IsObjectType(): valueMap := val.AsValueMap() specVal := &commonv1.ModuleSpec_Value{ Type: commonv1.ModuleSpec_ValueTypeObject, ComplexValue: make(map[string]*commonv1.ModuleSpec_Value, len(valueMap)), } for k, v := range valueMap { specVal.ComplexValue[k] = unwrap(v) } return specVal default: panic("none primitive values are not supported right now") } return nil }