func()

in codegen/module_system.go [748:849]


func (g *tchannelClientGenerator) Generate(
	instance *ModuleInstance,
) (*BuildResult, error) {
	clientSpecUntyped, err := g.ComputeSpec(instance)
	if err != nil {
		return nil, errors.Wrapf(
			err,
			"Error initializing TChannelClientSpec for %q",
			instance.InstanceName,
		)
	}
	clientSpec := clientSpecUntyped.(*ClientSpec)

	exposedMethods := reverseExposedMethods(clientSpec)

	sort.Sort(clientSpec.ModuleSpec.Services)

	var clientQPSLevels map[string]string = GetClientQPSLevels(instance.QPSLevels, exposedMethods, clientSpec.ClientID)

	clientMeta := &ClientMeta{
		Instance:         instance,
		ExportName:       clientSpec.ExportName,
		ExportType:       clientSpec.ExportType,
		Services:         clientSpec.ModuleSpec.Services,
		IncludedPackages: clientSpec.ModuleSpec.IncludedPackages,
		ClientID:         clientSpec.ClientID,
		ExposedMethods:   exposedMethods,
		QPSLevels:        clientQPSLevels,
		SidecarRouter:    clientSpec.SidecarRouter,
		DeputyReqHeader:  g.packageHelper.DeputyReqHeader(),
	}

	client, err := ExecuteDefaultOrCustomTemplate(
		"tchannel_client.tmpl",
		g.templates,
		instance.CustomTemplates,
		instance.Config,
		clientMeta,
		g.packageHelper,
	)
	if err != nil {
		return nil, errors.Wrapf(
			err,
			"Error executing TChannel 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,
	}

	genTestServer, _ := instance.Config["genTestServer"].(bool)
	if genTestServer {
		server, err := ExecuteDefaultOrCustomTemplate(
			"tchannel_client_test_server.tmpl",
			g.templates,
			instance.CustomTemplates,
			instance.Config,
			clientMeta,
			g.packageHelper,
		)
		if err != nil {
			return nil, errors.Wrapf(
				err,
				"Error executing TChannel server template for %q",
				instance.InstanceName,
			)
		}
		serverFilePath := baseName + "_test_server.go"
		files[serverFilePath] = server
	}

	if dependencies != nil {
		files["module/dependencies.go"] = dependencies
	}

	return &BuildResult{
		Files: files,
		Spec:  clientSpec,
	}, nil
}