buildr/modules/plugin/unwrap.go
Peter 34c431790e
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/tag Build is failing
refactor: use connect-go instead of regular Google gRPC
- support binary name for plugins
- register plugins for container jobs
2023-09-12 18:43:34 +02:00

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
}