func()

in codegen/method.go [763:834]


func (ms *MethodSpec) setClientRequestHeaderFields(
	funcSpec *compile.FunctionSpec, packageHelper *PackageHelper,
) error {
	fields := compile.FieldGroup(funcSpec.ArgsSpec)

	statements := LineBuilder{}
	var finalError error
	seenOptStructs := make(map[string]string)
	itrOrder := make([]string, 0)

	// Scan for all annotations
	visitor := func(
		goPrefix string, thriftPrefix string, field *compile.FieldSpec,
	) bool {
		realType := compile.RootTypeSpec(field.Type)
		longFieldName := goPrefix + "." + PascalCase(field.Name)

		// If the type is a struct then we cannot really do anything
		if _, ok := realType.(*compile.StructSpec); ok {
			// if a field is a struct then we must do a nil check
			typeName, err := GoType(packageHelper, realType)
			if err != nil {
				finalError = err
				return true
			}
			seenOptStructs[longFieldName] = typeName
			itrOrder = append(itrOrder, longFieldName)
			return false
		}

		if param, ok := field.Annotations[ms.annotations.HTTPRef]; ok {
			if strings.HasPrefix(param, headerAnnotationPrefix) {
				headerName := strings.TrimPrefix(param, headerAnnotationPrefix)
				bodyIdentifier := goPrefix + "." + PascalCase(field.Name)
				var headerNameValuePair string
				if field.Required {
					// Note header values are always string
					headerNameValuePair = "headers[%q]= string(r%s)"
				} else {
					headerNameValuePair = "headers[%q]= string(*r%s)"
				}
				if !field.Required {
					closeFunction := ""
					for _, seenStruct := range itrOrder {
						if strings.HasPrefix(longFieldName, seenStruct) {
							statements.appendf("if r%s != nil {", seenStruct)
							closeFunction = closeFunction + "}"
						}
					}

					statements.appendf("if r%s != nil {", bodyIdentifier)
					statements.appendf(headerNameValuePair, headerName, bodyIdentifier)
					statements.append("}")

					statements.append(closeFunction)
				} else {
					statements.appendf(headerNameValuePair,
						headerName, bodyIdentifier,
					)
				}
			}
		}
		return false
	}
	walkFieldGroups(fields, visitor)
	if finalError != nil {
		return finalError
	}

	ms.ReqClientHeaderGoStatements = statements.GetLines()
	return nil
}