in codegen/module_system.go [1044:1134]
func (g *gRPCClientGenerator) Generate(
instance *ModuleInstance,
) (*BuildResult, error) {
clientSpecUntyped, err := g.ComputeSpec(instance)
if err != nil {
return nil, errors.Wrapf(
err,
"error initializing GRPCClientSpec for %q",
instance.InstanceName,
)
}
clientSpec := clientSpecUntyped.(*ClientSpec)
reversedMethods := reverseExposedMethods(clientSpec)
serviceNames := map[string]struct{}{}
for key := range reversedMethods {
serviceName := strings.Split(key, "::")[0]
serviceNames[serviceName] = struct{}{}
}
services := ServiceSpecs{}
for name := range serviceNames {
services = append(services, &ServiceSpec{Name: name})
}
sort.Sort(&services)
var clientQPSLevels map[string]string = GetClientQPSLevels(instance.QPSLevels, reversedMethods, clientSpec.ClientID)
// @rpatali: Update all struct to use more general field IDLFile instead of thriftFile.
clientMeta := &ClientMeta{
ProtoServices: clientSpec.ModuleSpec.ProtoServices,
Instance: instance,
ExportName: clientSpec.ExportName,
ExportType: clientSpec.ExportType,
Services: services,
IncludedPackages: clientSpec.ModuleSpec.IncludedPackages,
ClientID: clientSpec.ClientID,
ExposedMethods: reversedMethods,
QPSLevels: clientQPSLevels,
}
client, err := ExecuteDefaultOrCustomTemplate(
"grpc_client.tmpl",
g.templates,
instance.CustomTemplates,
instance.Config,
clientMeta,
g.packageHelper,
)
if err != nil {
return nil, errors.Wrapf(
err,
"Error executing gRPC client template for %q",
instance.InstanceName,
)
}
// When it is possible to generate structs for all module types, the
// module system will do this transparently. For now we are opting in
// on a per-generator basis.
dependencies, err := GenerateDependencyStruct(
instance,
g.packageHelper,
g.templates,
)
if err != nil {
return nil, errors.Wrapf(
err,
"Error generating dependencies struct for %q %q",
instance.ClassName,
instance.InstanceName,
)
}
baseName := filepath.Base(instance.Directory)
clientFilePath := baseName + ".go"
files := map[string][]byte{
clientFilePath: client,
}
if dependencies != nil {
files["module/dependencies.go"] = dependencies
}
return &BuildResult{
Files: files,
Spec: clientSpec,
}, nil
}