func()

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
}