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
}