in src/go/configinfo/service_info.go [894:958]
func (s *ServiceInfo) processTypes() error {
// Convert into map by type name for easy lookup.
typesByTypeName := make(map[string]*typepb.Type)
for _, t := range s.ServiceConfig().GetTypes() {
typesByTypeName[t.Name] = t
}
// For each method, lookup the request type.
for operation, mi := range s.Methods {
requestTypeName := mi.RequestTypeName
// Only methods generated from Apis have non empty requestTypeName.
// Skip the methods with empty requestTypeName.
if requestTypeName == "" {
continue
}
requestType, ok := typesByTypeName[requestTypeName]
if !ok {
glog.Warningf("error processing types for operation (%v): could not find type with name (%v)", operation, requestTypeName)
continue
}
// Create snake name to JSON name mapping for the request operation (and validate against duplicates).
snakeToJson := make(SnakeToJsonSegments)
for _, field := range requestType.GetFields() {
if field.Name != field.JsonName {
if prevJsonName, ok := snakeToJson[field.GetName()]; ok {
if prevJsonName != field.GetJsonName() {
// Duplicate snake name with mismatching JSON name.
// This will cause an error in path matcher variable bindings.
// Disallow it.
return fmt.Errorf("error processing types for operation (%v): detected two types with same snake_name (%v) "+
"but mistmatching json_name (%v, %v)", operation, field.GetName(), field.GetJsonName(), prevJsonName)
}
}
// Unique entry.
snakeToJson[field.GetName()] = field.GetJsonName()
}
}
snakeNameToJsonNameForUriTemplates := func(m *MethodInfo, snakeNameToJsonName map[string]string) {
for _, httpRule := range m.HttpRule {
// Invalid uri templates are handled by `processHttpRules` so should be
// no empty UriTemplate here.
if httpRule.UriTemplate != nil {
httpRule.UriTemplate.ReplaceVariableField(snakeNameToJsonName)
}
}
}
// Replace the snake name with the json name in url template
if len(snakeToJson) > 0 {
snakeNameToJsonNameForUriTemplates(mi, snakeToJson)
if mi.GeneratedCorsMethod != nil {
snakeNameToJsonNameForUriTemplates(mi.GeneratedCorsMethod, snakeToJson)
}
}
}
return nil
}