in codegen/method.go [1215:1323]
func (ms *MethodSpec) setWriteQueryParamStatements(
funcSpec *compile.FunctionSpec, packageHelper *PackageHelper, hasNoBody bool,
) error {
var statements LineBuilder
var hasQueryFields bool
var stack []string
isVoidReturn := funcSpec.ResultSpec.ReturnType == nil
visitor := func(
goPrefix string, thriftPrefix string, field *compile.FieldSpec,
) bool {
// Skip if there are no query params in the field or its components
if !ms.hasQueryParams(field, hasNoBody) {
return false
}
if !hasQueryFields {
statements.append("queryValues := &url.Values{}")
hasQueryFields = true
}
realType := compile.RootTypeSpec(field.Type)
longFieldName := goPrefix + "." + PascalCase(field.Name)
if len(stack) > 0 {
if !strings.HasPrefix(longFieldName, stack[len(stack)-1]) {
stack = stack[:len(stack)-1]
statements.append("}")
}
}
if _, ok := realType.(*compile.StructSpec); ok {
// If a field is a struct we need to look inside
if field.Required {
statements.appendf("if r%s == nil {", longFieldName)
// Generate correct number of nils...
if isVoidReturn {
statements.append("\treturn ctx, nil, errors.New(")
} else {
statements.append("\treturn ctx, nil, nil, errors.New(")
}
statements.appendf("\t\t\"The field %s is required\",",
longFieldName,
)
statements.append("\t)")
statements.append("}")
} else {
stack = append(stack, longFieldName)
statements.appendf("if r%s != nil {", longFieldName)
}
return false
}
longQueryName, shortQueryParam := ms.getQueryParamInfo(field, thriftPrefix)
identifierName := CamelCase(longQueryName) + "Query"
_, isList := realType.(*compile.ListSpec)
_, isSet := realType.(*compile.SetSpec)
if field.Required {
if isList {
encodeExpr := getQueryEncodeExpression(field.Type, "value")
statements.appendf("for _, value := range %s {", "r"+longFieldName)
statements.appendf("\tqueryValues.Add(\"%s\", %s)", shortQueryParam, encodeExpr)
statements.append("}")
} else if isSet {
encodeExpr := getQueryEncodeExpression(field.Type, "value")
statements.appendf("for value := range %s {", "r"+longFieldName)
statements.appendf("\tqueryValues.Add(\"%s\", %s)", shortQueryParam, encodeExpr)
statements.append("}")
} else {
encodeExpr := getQueryEncodeExpression(field.Type, "r"+longFieldName)
statements.appendf("%s := %s", identifierName, encodeExpr)
statements.appendf("queryValues.Set(\"%s\", %s)", shortQueryParam, identifierName)
}
} else {
statements.appendf("if r%s != nil {", longFieldName)
if isList {
encodeExpr := getQueryEncodeExpression(field.Type, "value")
statements.appendf("for _, value := range %s {", "r"+longFieldName)
statements.appendf("\tqueryValues.Add(\"%s\", %s)", shortQueryParam, encodeExpr)
statements.append("}")
} else if isSet {
encodeExpr := getQueryEncodeExpression(field.Type, "value")
statements.appendf("for value := range %s {", "r"+longFieldName)
statements.appendf("\tqueryValues.Add(\"%s\", %s)", shortQueryParam, encodeExpr)
statements.append("}")
} else {
encodeExpr := getQueryEncodeExpression(field.Type, "*r"+longFieldName)
statements.appendf("\t%s := %s", identifierName, encodeExpr)
statements.appendf("\tqueryValues.Set(\"%s\", %s)", shortQueryParam, identifierName)
}
statements.append("}")
}
return false
}
walkFieldGroups(compile.FieldGroup(funcSpec.ArgsSpec), visitor)
for i := 0; i < len(stack); i++ {
statements.append("}")
}
if hasQueryFields {
statements.append("fullURL += \"?\" + queryValues.Encode()")
}
ms.WriteQueryParamGoStatements = statements.GetLines()
return nil
}