82 lines
2.3 KiB
Go
82 lines
2.3 KiB
Go
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
|
|
}
|