func()

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
}