From 66b3e4eb77242317b90d4ca074badad8e25d7092 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Wed, 12 Jun 2019 11:08:32 -0700 Subject: [PATCH] grpc-tools: Add option to generate package definition --- packages/grpc-tools/src/node_generator.cc | 37 +++++++++++++++-------- packages/grpc-tools/src/node_generator.h | 8 ++++- packages/grpc-tools/src/node_plugin.cc | 16 ++++++++-- 3 files changed, 46 insertions(+), 15 deletions(-) diff --git a/packages/grpc-tools/src/node_generator.cc b/packages/grpc-tools/src/node_generator.cc index aa490114..72059470 100644 --- a/packages/grpc-tools/src/node_generator.cc +++ b/packages/grpc-tools/src/node_generator.cc @@ -178,11 +178,17 @@ void PrintMethod(const MethodDescriptor* method, Printer* out) { } // Prints out the service descriptor object -void PrintService(const ServiceDescriptor* service, Printer* out) { +void PrintService(const ServiceDescriptor* service, Printer* out, + const Parameters& params) { map template_vars; out->Print(GetNodeComments(service, true).c_str()); template_vars["name"] = service->name(); - out->Print(template_vars, "var $name$Service = exports.$name$Service = {\n"); + template_vars["full_name"] = service->full_name(); + if (params.generate_package_definition) { + out->Print(template_vars, "var $name$Service = exports['$full_name$'] = {\n"); + } else { + out->Print(template_vars, "var $name$Service = exports.$name$Service = {\n"); + } out->Indent(); for (int i = 0; i < service->method_count(); i++) { grpc::string method_name = @@ -195,14 +201,19 @@ void PrintService(const ServiceDescriptor* service, Printer* out) { } out->Outdent(); out->Print("};\n\n"); - out->Print(template_vars, - "exports.$name$Client = " - "grpc.makeGenericClientConstructor($name$Service);\n"); + if (!params.generate_package_definition) { + out->Print(template_vars, + "exports.$name$Client = " + "grpc.makeGenericClientConstructor($name$Service);\n"); + } out->Print(GetNodeComments(service, false).c_str()); } -void PrintImports(const FileDescriptor* file, Printer* out) { - out->Print("var grpc = require('grpc');\n"); +void PrintImports(const FileDescriptor* file, Printer* out, + const Parameters& params) { + if (!params.generate_package_definition) { + out->Print("var grpc = require('grpc');\n"); + } if (file->message_type_count() > 0) { grpc::string file_path = GetRelativePath(file->name(), GetJSMessageFilename(file->name())); @@ -230,14 +241,16 @@ void PrintTransformers(const FileDescriptor* file, Printer* out) { out->Print("\n"); } -void PrintServices(const FileDescriptor* file, Printer* out) { +void PrintServices(const FileDescriptor* file, Printer* out, + const Parameters& params) { for (int i = 0; i < file->service_count(); i++) { - PrintService(file->service(i), out); + PrintService(file->service(i), out, params); } } } // namespace -grpc::string GenerateFile(const FileDescriptor* file) { +grpc::string GenerateFile(const FileDescriptor* file, + const Parameters& params) { grpc::string output; { StringOutputStream output_stream(&output); @@ -257,11 +270,11 @@ grpc::string GenerateFile(const FileDescriptor* file) { out.Print("'use strict';\n"); - PrintImports(file, &out); + PrintImports(file, &out, params); PrintTransformers(file, &out); - PrintServices(file, &out); + PrintServices(file, &out, params); out.Print(GetNodeComments(file, false).c_str()); } diff --git a/packages/grpc-tools/src/node_generator.h b/packages/grpc-tools/src/node_generator.h index ce7b8a3f..c73eca0c 100644 --- a/packages/grpc-tools/src/node_generator.h +++ b/packages/grpc-tools/src/node_generator.h @@ -23,7 +23,13 @@ namespace grpc_node_generator { -grpc::string GenerateFile(const grpc::protobuf::FileDescriptor* file); +struct Parameters { + // Generate a package definition object instead of Client classes + bool generate_package_definition; +}; + +grpc::string GenerateFile(const grpc::protobuf::FileDescriptor* file, + const Parameters& params); } // namespace grpc_node_generator diff --git a/packages/grpc-tools/src/node_plugin.cc b/packages/grpc-tools/src/node_plugin.cc index 20e65e7f..a502dca8 100644 --- a/packages/grpc-tools/src/node_plugin.cc +++ b/packages/grpc-tools/src/node_plugin.cc @@ -36,8 +36,20 @@ class NodeGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { const grpc::string& parameter, grpc::protobuf::compiler::GeneratorContext* context, grpc::string* error) const { - - grpc::string code = GenerateFile(file); + grpc_node_generator::Parameters generator_parameters; + generator_parameters.generate_package_definition = false; + if (!parameter.empty()) { + std::vector parameters_list = + grpc_generator::tokenize(parameter, ","); + for (auto parameter_string = parameters_list.begin(); + parameter_string != parameters_list.end(); parameter_string++) { + printf("%s", parameter_string); + if (*parameter_string == "generate_package_definition") { + generator_parameters.generate_package_definition = true; + } + } + } + grpc::string code = GenerateFile(file, generator_parameters); if (code.size() == 0) { return true; }