func()

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
}