blob: 9ba2e65f1376dcf49500790fde1f87a66c3842f6 [file] [log] [blame]
Austin Schuhe89fa2d2019-08-14 20:24:23 -07001#include "src/compiler/go_generator.h"
2
James Kuszmaul8e62b022022-03-22 09:33:25 -07003#include <cctype>
4#include <map>
5#include <sstream>
6
7template<class T> grpc::string as_string(T x) {
8 std::ostringstream out;
9 out << x;
10 return out.str();
Austin Schuhe89fa2d2019-08-14 20:24:23 -070011}
12
13inline bool ClientOnlyStreaming(const grpc_generator::Method *method) {
14 return method->ClientStreaming() && !method->ServerStreaming();
15}
16
17inline bool ServerOnlyStreaming(const grpc_generator::Method *method) {
18 return !method->ClientStreaming() && method->ServerStreaming();
19}
20
21namespace grpc_go_generator {
22
23// Returns string with first letter to lowerCase
24grpc::string unexportName(grpc::string s) {
James Kuszmaul8e62b022022-03-22 09:33:25 -070025 if (s.empty()) return s;
26 s[0] = static_cast<char>(std::tolower(s[0]));
27 return s;
Austin Schuhe89fa2d2019-08-14 20:24:23 -070028}
29
30// Returns string with first letter to uppercase
31grpc::string exportName(grpc::string s) {
James Kuszmaul8e62b022022-03-22 09:33:25 -070032 if (s.empty()) return s;
33 s[0] = static_cast<char>(std::toupper(s[0]));
34 return s;
35}
36
37void GenerateError(grpc_generator::Printer *printer,
38 std::map<grpc::string, grpc::string> vars,
39 const bool multiple_return = true) {
40 printer->Print(vars, "if $Error_Check$ {\n");
41 printer->Indent();
42 vars["Return"] = multiple_return ? "nil, err" : "err";
43 printer->Print(vars, "return $Return$\n");
44 printer->Outdent();
45 printer->Print("}\n");
Austin Schuhe89fa2d2019-08-14 20:24:23 -070046}
47
48// Generates imports for the service
James Kuszmaul8e62b022022-03-22 09:33:25 -070049void GenerateImports(grpc_generator::File *file,
50 grpc_generator::Printer *printer,
Austin Schuhe89fa2d2019-08-14 20:24:23 -070051 std::map<grpc::string, grpc::string> vars) {
James Kuszmaul8e62b022022-03-22 09:33:25 -070052 vars["filename"] = file->filename();
53 printer->Print("//Generated by gRPC Go plugin\n");
54 printer->Print("//If you make any local changes, they will be lost\n");
55 printer->Print(vars, "//source: $filename$\n\n");
56 printer->Print(vars, "package $Package$\n\n");
57 printer->Print("import (\n");
58 printer->Indent();
59 printer->Print(vars, "$context$ \"context\"\n");
60 printer->Print("flatbuffers \"github.com/google/flatbuffers/go\"\n");
61 printer->Print(vars, "$grpc$ \"google.golang.org/grpc\"\n");
62 printer->Print("\"google.golang.org/grpc/codes\"\n");
63 printer->Print("\"google.golang.org/grpc/status\"\n");
64 printer->Outdent();
65 printer->Print(")\n\n");
Austin Schuhe89fa2d2019-08-14 20:24:23 -070066}
67
68// Generates Server method signature source
James Kuszmaul8e62b022022-03-22 09:33:25 -070069void GenerateServerMethodSignature(const grpc_generator::Method *method,
70 grpc_generator::Printer *printer,
Austin Schuhe89fa2d2019-08-14 20:24:23 -070071 std::map<grpc::string, grpc::string> vars) {
James Kuszmaul8e62b022022-03-22 09:33:25 -070072 vars["Method"] = exportName(method->name());
73 vars["Request"] = method->get_input_type_name();
74 vars["Response"] = (vars["CustomMethodIO"] == "")
75 ? method->get_output_type_name()
76 : vars["CustomMethodIO"];
77 if (method->NoStreaming()) {
78 printer->Print(
79 vars,
80 "$Method$($context$.Context, *$Request$) (*$Response$, error)$Ending$");
81 } else if (ServerOnlyStreaming(method)) {
82 printer->Print(
83 vars, "$Method$(*$Request$, $Service$_$Method$Server) error$Ending$");
84 } else {
85 printer->Print(vars, "$Method$($Service$_$Method$Server) error$Ending$");
86 }
Austin Schuhe89fa2d2019-08-14 20:24:23 -070087}
88
James Kuszmaul8e62b022022-03-22 09:33:25 -070089void GenerateServerMethod(const grpc_generator::Method *method,
90 grpc_generator::Printer *printer,
Austin Schuhe89fa2d2019-08-14 20:24:23 -070091 std::map<grpc::string, grpc::string> vars) {
James Kuszmaul8e62b022022-03-22 09:33:25 -070092 vars["Method"] = exportName(method->name());
93 vars["Request"] = method->get_input_type_name();
94 vars["Response"] = (vars["CustomMethodIO"] == "")
95 ? method->get_output_type_name()
96 : vars["CustomMethodIO"];
97 vars["FullMethodName"] =
98 "/" + vars["ServicePrefix"] + vars["Service"] + "/" + vars["Method"];
99 vars["Handler"] = "_" + vars["Service"] + "_" + vars["Method"] + "_Handler";
100 if (method->NoStreaming()) {
101 printer->Print(
102 vars,
103 "func $Handler$(srv interface{}, ctx $context$.Context,\n\tdec "
104 "func(interface{}) error, interceptor $grpc$.UnaryServerInterceptor) "
105 "(interface{}, error) {\n");
106 printer->Indent();
107 printer->Print(vars, "in := new($Request$)\n");
108 vars["Error_Check"] = "err := dec(in); err != nil";
109 GenerateError(printer, vars);
110 printer->Print("if interceptor == nil {\n");
111 printer->Indent();
112 printer->Print(vars, "return srv.($Service$Server).$Method$(ctx, in)\n");
113 printer->Outdent();
114 printer->Print("}\n");
115 printer->Print(vars, "info := &$grpc$.UnaryServerInfo{\n");
116 printer->Indent();
117 printer->Print("Server: srv,\n");
118 printer->Print(vars, "FullMethod: \"$FullMethodName$\",\n");
119 printer->Outdent();
120 printer->Print("}\n");
121 printer->Outdent();
122 printer->Print("\n");
123 printer->Indent();
124 printer->Print(vars,
125 "handler := func(ctx $context$.Context, req interface{}) "
126 "(interface{}, error) {\n");
127 printer->Indent();
128 printer->Print(
129 vars, "return srv.($Service$Server).$Method$(ctx, req.(*$Request$))\n");
130 printer->Outdent();
131 printer->Print("}\n");
132 printer->Print("return interceptor(ctx, in, info, handler)\n");
133 printer->Outdent();
134 printer->Print("}\n");
135 return;
136 }
137 vars["StreamType"] = vars["ServiceUnexported"] + vars["Method"] + "Server";
138 printer->Print(
139 vars,
140 "func $Handler$(srv interface{}, stream $grpc$.ServerStream) error {\n");
141 printer->Indent();
142 if (ServerOnlyStreaming(method)) {
143 printer->Print(vars, "m := new($Request$)\n");
144 vars["Error_Check"] = "err := stream.RecvMsg(m); err != nil";
145 GenerateError(printer, vars, false);
146 printer->Print(
147 vars,
148 "return srv.($Service$Server).$Method$(m, &$StreamType${stream})\n");
149 } else {
150 printer->Print(
151 vars, "return srv.($Service$Server).$Method$(&$StreamType${stream})\n");
152 }
153 printer->Outdent();
154 printer->Print("}\n\n");
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700155
James Kuszmaul8e62b022022-03-22 09:33:25 -0700156 bool genSend = method->BidiStreaming() || ServerOnlyStreaming(method);
157 bool genRecv = method->BidiStreaming() || ClientOnlyStreaming(method);
158 bool genSendAndClose = ClientOnlyStreaming(method);
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700159
James Kuszmaul8e62b022022-03-22 09:33:25 -0700160 printer->Print(vars, "type $Service$_$Method$Server interface {\n");
161 printer->Indent();
162 if (genSend) { printer->Print(vars, "Send(*$Response$) error\n"); }
163 if (genRecv) { printer->Print(vars, "Recv() (*$Request$, error)\n"); }
164 if (genSendAndClose) {
165 printer->Print(vars, "SendAndClose(*$Response$) error\n");
166 }
167 printer->Print(vars, "$grpc$.ServerStream\n");
168 printer->Outdent();
169 printer->Print("}\n\n");
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700170
James Kuszmaul8e62b022022-03-22 09:33:25 -0700171 printer->Print(vars, "type $StreamType$ struct {\n");
172 printer->Indent();
173 printer->Print(vars, "$grpc$.ServerStream\n");
174 printer->Outdent();
175 printer->Print("}\n\n");
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700176
James Kuszmaul8e62b022022-03-22 09:33:25 -0700177 if (genSend) {
178 printer->Print(vars,
179 "func (x *$StreamType$) Send(m *$Response$) error {\n");
180 printer->Indent();
181 printer->Print("return x.ServerStream.SendMsg(m)\n");
182 printer->Outdent();
183 printer->Print("}\n\n");
184 }
185 if (genRecv) {
186 printer->Print(vars,
187 "func (x *$StreamType$) Recv() (*$Request$, error) {\n");
188 printer->Indent();
189 printer->Print(vars, "m := new($Request$)\n");
190 vars["Error_Check"] = "err := x.ServerStream.RecvMsg(m); err != nil";
191 GenerateError(printer, vars);
192 printer->Print("return m, nil\n");
193 printer->Outdent();
194 printer->Print("}\n\n");
195 }
196 if (genSendAndClose) {
197 printer->Print(
198 vars, "func (x *$StreamType$) SendAndClose(m *$Response$) error {\n");
199 printer->Indent();
200 printer->Print("return x.ServerStream.SendMsg(m)\n");
201 printer->Outdent();
202 printer->Print("}\n\n");
203 }
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700204}
205
206// Generates Client method signature source
James Kuszmaul8e62b022022-03-22 09:33:25 -0700207void GenerateClientMethodSignature(const grpc_generator::Method *method,
208 grpc_generator::Printer *printer,
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700209 std::map<grpc::string, grpc::string> vars) {
James Kuszmaul8e62b022022-03-22 09:33:25 -0700210 vars["Method"] = exportName(method->name());
211 vars["Request"] =
212 ", in *" + ((vars["CustomMethodIO"] == "") ? method->get_input_type_name()
213 : vars["CustomMethodIO"]);
214 if (ClientOnlyStreaming(method) || method->BidiStreaming()) {
215 vars["Request"] = "";
216 }
217 vars["Response"] = "*" + method->get_output_type_name();
218 if (ClientOnlyStreaming(method) || method->BidiStreaming() ||
219 ServerOnlyStreaming(method)) {
220 vars["Response"] = vars["Service"] + "_" + vars["Method"] + "Client";
221 }
222 printer->Print(vars,
223 "$Method$(ctx $context$.Context$Request$,\n\topts "
224 "...$grpc$.CallOption) ($Response$, error)$Ending$");
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700225}
226
227// Generates Client method source
James Kuszmaul8e62b022022-03-22 09:33:25 -0700228void GenerateClientMethod(const grpc_generator::Method *method,
229 grpc_generator::Printer *printer,
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700230 std::map<grpc::string, grpc::string> vars) {
James Kuszmaul8e62b022022-03-22 09:33:25 -0700231 printer->Print(vars, "func (c *$ServiceUnexported$Client) ");
232 vars["Ending"] = " {\n";
233 GenerateClientMethodSignature(method, printer, vars);
234 printer->Indent();
235 vars["Method"] = exportName(method->name());
236 vars["Request"] = (vars["CustomMethodIO"] == "")
237 ? method->get_input_type_name()
238 : vars["CustomMethodIO"];
239 vars["Response"] = method->get_output_type_name();
240 vars["FullMethodName"] =
241 "/" + vars["ServicePrefix"] + vars["Service"] + "/" + vars["Method"];
242 if (method->NoStreaming()) {
243 printer->Print(vars, "out := new($Response$)\n");
244 printer->Print(
245 vars,
246 "err := c.cc.Invoke(ctx, \"$FullMethodName$\", in, out, opts...)\n");
247 vars["Error_Check"] = "err != nil";
248 GenerateError(printer, vars);
249 printer->Print("return out, nil\n");
250 printer->Outdent();
251 printer->Print("}\n\n");
252 return;
253 }
254 vars["StreamType"] = vars["ServiceUnexported"] + vars["Method"] + "Client";
255 printer->Print(vars,
256 "stream, err := c.cc.NewStream(ctx, &$MethodDesc$, "
257 "\"$FullMethodName$\", opts...)\n");
258 vars["Error_Check"] = "err != nil";
259 GenerateError(printer, vars);
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700260
James Kuszmaul8e62b022022-03-22 09:33:25 -0700261 printer->Print(vars, "x := &$StreamType${stream}\n");
262 if (ServerOnlyStreaming(method)) {
263 vars["Error_Check"] = "err := x.ClientStream.SendMsg(in); err != nil";
264 GenerateError(printer, vars);
265 vars["Error_Check"] = "err := x.ClientStream.CloseSend(); err != nil";
266 GenerateError(printer, vars);
267 }
268 printer->Print("return x, nil\n");
269 printer->Outdent();
270 printer->Print("}\n\n");
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700271
James Kuszmaul8e62b022022-03-22 09:33:25 -0700272 bool genSend = method->BidiStreaming() || ClientOnlyStreaming(method);
273 bool genRecv = method->BidiStreaming() || ServerOnlyStreaming(method);
274 bool genCloseAndRecv = ClientOnlyStreaming(method);
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700275
James Kuszmaul8e62b022022-03-22 09:33:25 -0700276 // Stream interface
277 printer->Print(vars, "type $Service$_$Method$Client interface {\n");
278 printer->Indent();
279 if (genSend) { printer->Print(vars, "Send(*$Request$) error\n"); }
280 if (genRecv) { printer->Print(vars, "Recv() (*$Response$, error)\n"); }
281 if (genCloseAndRecv) {
282 printer->Print(vars, "CloseAndRecv() (*$Response$, error)\n");
283 }
284 printer->Print(vars, "$grpc$.ClientStream\n");
285 printer->Outdent();
286 printer->Print("}\n\n");
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700287
James Kuszmaul8e62b022022-03-22 09:33:25 -0700288 // Stream Client
289 printer->Print(vars, "type $StreamType$ struct {\n");
290 printer->Indent();
291 printer->Print(vars, "$grpc$.ClientStream\n");
292 printer->Outdent();
293 printer->Print("}\n\n");
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700294
James Kuszmaul8e62b022022-03-22 09:33:25 -0700295 if (genSend) {
296 printer->Print(vars, "func (x *$StreamType$) Send(m *$Request$) error {\n");
297 printer->Indent();
298 printer->Print("return x.ClientStream.SendMsg(m)\n");
299 printer->Outdent();
300 printer->Print("}\n\n");
301 }
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700302
James Kuszmaul8e62b022022-03-22 09:33:25 -0700303 if (genRecv) {
304 printer->Print(vars,
305 "func (x *$StreamType$) Recv() (*$Response$, error) {\n");
306 printer->Indent();
307 printer->Print(vars, "m := new($Response$)\n");
308 vars["Error_Check"] = "err := x.ClientStream.RecvMsg(m); err != nil";
309 GenerateError(printer, vars);
310 printer->Print("return m, nil\n");
311 printer->Outdent();
312 printer->Print("}\n\n");
313 }
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700314
James Kuszmaul8e62b022022-03-22 09:33:25 -0700315 if (genCloseAndRecv) {
316 printer->Print(
317 vars, "func (x *$StreamType$) CloseAndRecv() (*$Response$, error) {\n");
318 printer->Indent();
319 vars["Error_Check"] = "err := x.ClientStream.CloseSend(); err != nil";
320 GenerateError(printer, vars);
321 printer->Print(vars, "m := new($Response$)\n");
322 vars["Error_Check"] = "err := x.ClientStream.RecvMsg(m); err != nil";
323 GenerateError(printer, vars);
324 printer->Print("return m, nil\n");
325 printer->Outdent();
326 printer->Print("}\n\n");
327 }
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700328}
329
330// Generates client API for the service
James Kuszmaul8e62b022022-03-22 09:33:25 -0700331void GenerateService(const grpc_generator::Service *service,
332 grpc_generator::Printer *printer,
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700333 std::map<grpc::string, grpc::string> vars) {
James Kuszmaul8e62b022022-03-22 09:33:25 -0700334 vars["Service"] = exportName(service->name());
335 // Client Interface
336 printer->Print(vars, "// Client API for $Service$ service\n");
337 printer->Print(vars, "type $Service$Client interface {\n");
338 printer->Indent();
339 vars["Ending"] = "\n";
340 for (int i = 0; i < service->method_count(); i++) {
341 GenerateClientMethodSignature(service->method(i).get(), printer, vars);
342 }
343 printer->Outdent();
344 printer->Print("}\n\n");
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700345
James Kuszmaul8e62b022022-03-22 09:33:25 -0700346 // Client structure
347 vars["ServiceUnexported"] = unexportName(vars["Service"]);
348 printer->Print(vars, "type $ServiceUnexported$Client struct {\n");
349 printer->Indent();
350 printer->Print(vars, "cc $grpc$.ClientConnInterface\n");
351 printer->Outdent();
352 printer->Print("}\n\n");
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700353
James Kuszmaul8e62b022022-03-22 09:33:25 -0700354 // NewClient
355 printer->Print(vars,
356 "func New$Service$Client(cc $grpc$.ClientConnInterface) "
357 "$Service$Client {\n");
358 printer->Indent();
359 printer->Print(vars, "return &$ServiceUnexported$Client{cc}");
360 printer->Outdent();
361 printer->Print("\n}\n\n");
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700362
James Kuszmaul8e62b022022-03-22 09:33:25 -0700363 int unary_methods = 0, streaming_methods = 0;
364 vars["ServiceDesc"] = "_" + vars["Service"] + "_serviceDesc";
365 for (int i = 0; i < service->method_count(); i++) {
366 auto method = service->method(i);
367 if (method->NoStreaming()) {
368 vars["MethodDesc"] =
369 vars["ServiceDesc"] + ".Method[" + as_string(unary_methods) + "]";
370 unary_methods++;
371 } else {
372 vars["MethodDesc"] = vars["ServiceDesc"] + ".Streams[" +
373 as_string(streaming_methods) + "]";
374 streaming_methods++;
375 }
376 GenerateClientMethod(method.get(), printer, vars);
377 }
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700378
James Kuszmaul8e62b022022-03-22 09:33:25 -0700379 // Server Interface
380 printer->Print(vars, "// Server API for $Service$ service\n");
381 printer->Print(vars, "type $Service$Server interface {\n");
382 printer->Indent();
383 vars["Ending"] = "\n";
384 for (int i = 0; i < service->method_count(); i++) {
385 GenerateServerMethodSignature(service->method(i).get(), printer, vars);
386 }
387 printer->Print(vars, "mustEmbedUnimplemented$Service$Server()\n");
388 printer->Outdent();
389 printer->Print("}\n\n");
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700390
James Kuszmaul8e62b022022-03-22 09:33:25 -0700391 printer->Print(vars, "type Unimplemented$Service$Server struct {\n");
392 printer->Print("}\n\n");
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700393
James Kuszmaul8e62b022022-03-22 09:33:25 -0700394 vars["Ending"] = " {\n";
395 for (int i = 0; i < service->method_count(); i++) {
396 auto method = service->method(i);
397 vars["Method"] = exportName(method->name());
398 vars["Nil"] = method->NoStreaming() ? "nil, " : "";
399 printer->Print(vars, "func (Unimplemented$Service$Server) ");
400 GenerateServerMethodSignature(method.get(), printer, vars);
401 printer->Indent();
402 printer->Print(vars,
403 "return $Nil$status.Errorf(codes.Unimplemented, \"method "
404 "$Method$ not implemented\")\n");
405 printer->Outdent();
406 printer->Print("}\n");
407 printer->Print("\n");
408 }
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700409
James Kuszmaul8e62b022022-03-22 09:33:25 -0700410 printer->Print(vars,
411 "func (Unimplemented$Service$Server) "
412 "mustEmbedUnimplemented$Service$Server() {}");
413 printer->Print("\n\n");
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700414
James Kuszmaul8e62b022022-03-22 09:33:25 -0700415 printer->Print(vars, "type Unsafe$Service$Server interface {\n");
416 printer->Indent();
417 printer->Print(vars, "mustEmbedUnimplemented$Service$Server()\n");
418 printer->Outdent();
419 printer->Print("}\n\n");
420 // Server registration.
421 printer->Print(vars,
422 "func Register$Service$Server(s $grpc$.ServiceRegistrar, srv "
423 "$Service$Server) {\n");
424 printer->Indent();
425 printer->Print(vars, "s.RegisterService(&$ServiceDesc$, srv)\n");
426 printer->Outdent();
427 printer->Print("}\n\n");
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700428
James Kuszmaul8e62b022022-03-22 09:33:25 -0700429 for (int i = 0; i < service->method_count(); i++) {
430 GenerateServerMethod(service->method(i).get(), printer, vars);
431 }
432
433 // Service Descriptor
434 printer->Print(vars, "var $ServiceDesc$ = $grpc$.ServiceDesc{\n");
435 printer->Indent();
436 printer->Print(vars, "ServiceName: \"$ServicePrefix$$Service$\",\n");
437 printer->Print(vars, "HandlerType: (*$Service$Server)(nil),\n");
438 printer->Print(vars, "Methods: []$grpc$.MethodDesc{\n");
439 printer->Indent();
440 for (int i = 0; i < service->method_count(); i++) {
441 auto method = service->method(i);
442 vars["Method"] = exportName(method->name());
443 vars["Handler"] = "_" + vars["Service"] + "_" + vars["Method"] + "_Handler";
444 if (method->NoStreaming()) {
445 printer->Print("{\n");
446 printer->Indent();
447 printer->Print(vars, "MethodName: \"$Method$\",\n");
448 printer->Print(vars, "Handler: $Handler$,\n");
449 printer->Outdent();
450 printer->Print("},\n");
451 }
452 }
453 printer->Outdent();
454 printer->Print("},\n");
455 printer->Print(vars, "Streams: []$grpc$.StreamDesc{\n");
456 printer->Indent();
457 for (int i = 0; i < service->method_count(); i++) {
458 auto method = service->method(i);
459 vars["Method"] = exportName(method->name());
460 vars["Handler"] = "_" + vars["Service"] + "_" + vars["Method"] + "_Handler";
461 if (!method->NoStreaming()) {
462 printer->Print("{\n");
463 printer->Indent();
464 printer->Print(vars, "StreamName: \"$Method$\",\n");
465 printer->Print(vars, "Handler: $Handler$,\n");
466 if (ClientOnlyStreaming(method.get())) {
467 printer->Print("ClientStreams: true,\n");
468 } else if (ServerOnlyStreaming(method.get())) {
469 printer->Print("ServerStreams: true,\n");
470 } else {
471 printer->Print("ServerStreams: true,\n");
472 printer->Print("ClientStreams: true,\n");
473 }
474 printer->Outdent();
475 printer->Print("},\n");
476 }
477 }
478 printer->Outdent();
479 printer->Print("},\n");
480 printer->Outdent();
481 printer->Print("}\n");
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700482}
483
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700484// Returns source for the service
485grpc::string GenerateServiceSource(grpc_generator::File *file,
486 const grpc_generator::Service *service,
487 grpc_go_generator::Parameters *parameters) {
James Kuszmaul8e62b022022-03-22 09:33:25 -0700488 grpc::string out;
489 auto p = file->CreatePrinter(&out, '\t');
490 p->SetIndentationSize(1);
491 auto printer = p.get();
492 std::map<grpc::string, grpc::string> vars;
493 vars["Package"] = parameters->package_name;
494 vars["ServicePrefix"] = parameters->service_prefix;
495 if (!parameters->service_prefix.empty()) vars["ServicePrefix"].append(".");
496 vars["grpc"] = "grpc";
497 vars["context"] = "context";
498 GenerateImports(file, printer, vars);
499 if (parameters->custom_method_io_type != "") {
500 vars["CustomMethodIO"] = parameters->custom_method_io_type;
501 }
502 GenerateService(service, printer, vars);
503 return out;
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700504}
James Kuszmaul8e62b022022-03-22 09:33:25 -0700505} // Namespace grpc_go_generator