in codegen/method.go [937:1011]
func (ms *MethodSpec) setTypeConverters(
funcSpec *compile.FunctionSpec,
downstreamSpec *compile.FunctionSpec,
reqTransforms map[string]FieldMapperEntry,
headersPropagate map[string]FieldMapperEntry,
respTransforms map[string]FieldMapperEntry,
h *PackageHelper,
downstreamMethod *MethodSpec,
) error {
// TODO(sindelar): Iterate over fields that are structs (for foo/bar examples).
// Add type checking and conversion, custom mapping
structType := compile.FieldGroup(funcSpec.ArgsSpec)
downstreamStructType := compile.FieldGroup(downstreamSpec.ArgsSpec)
typeConverter := NewTypeConverter(h, headersPropagate)
typeConverter.append(
"func convertTo",
PascalCase(ms.Name),
"ClientRequest(in ", ms.RequestType, ") ", downstreamMethod.RequestType, "{")
typeConverter.append("out := &", downstreamMethod.ShortRequestType, "{}\n")
err := typeConverter.GenStructConverter(structType, downstreamStructType, reqTransforms)
if err != nil {
return err
}
typeConverter.append("\nreturn out")
typeConverter.append("}")
ms.ConvertRequestGoStatements = typeConverter.GetLines()
// TODO: support non-struct return types
respType := funcSpec.ResultSpec.ReturnType
downstreamRespType := downstreamMethod.CompiledThriftSpec.ResultSpec.ReturnType
if respType == nil || downstreamRespType == nil {
return nil
}
respConverter := NewTypeConverter(h, nil)
respConverter.append(
"func convert",
PascalCase(ms.DownstreamService), PascalCase(ms.Name),
"ClientResponse(in ", downstreamMethod.ResponseType, ") ", ms.ResponseType, "{")
var respFields, downstreamRespFields []*compile.FieldSpec
switch respType.(type) {
case
*compile.BoolSpec,
*compile.I8Spec,
*compile.I16Spec,
*compile.I32Spec,
*compile.EnumSpec,
*compile.I64Spec,
*compile.DoubleSpec,
*compile.StringSpec:
respConverter.append("out", " := in\t\n")
default:
// default as struct
respFields = respType.(*compile.StructSpec).Fields
downstreamRespFields = downstreamRespType.(*compile.StructSpec).Fields
respConverter.append("out", " := ", "&", ms.ShortResponseType, "{}\t\n")
err = respConverter.GenStructConverter(downstreamRespFields, respFields, respTransforms)
if err != nil {
return err
}
}
respConverter.append("\nreturn out \t}")
ms.ConvertResponseGoStatements = respConverter.GetLines()
return nil
}