xref: /aosp_15_r20/external/grpc-grpc/src/compiler/php_generator.cc (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker /*
2*cc02d7e2SAndroid Build Coastguard Worker  *
3*cc02d7e2SAndroid Build Coastguard Worker  * Copyright 2016 gRPC authors.
4*cc02d7e2SAndroid Build Coastguard Worker  *
5*cc02d7e2SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*cc02d7e2SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*cc02d7e2SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
8*cc02d7e2SAndroid Build Coastguard Worker  *
9*cc02d7e2SAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
10*cc02d7e2SAndroid Build Coastguard Worker  *
11*cc02d7e2SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*cc02d7e2SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*cc02d7e2SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*cc02d7e2SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*cc02d7e2SAndroid Build Coastguard Worker  * limitations under the License.
16*cc02d7e2SAndroid Build Coastguard Worker  *
17*cc02d7e2SAndroid Build Coastguard Worker  */
18*cc02d7e2SAndroid Build Coastguard Worker 
19*cc02d7e2SAndroid Build Coastguard Worker #include <map>
20*cc02d7e2SAndroid Build Coastguard Worker 
21*cc02d7e2SAndroid Build Coastguard Worker #include <google/protobuf/compiler/php/php_generator.h>
22*cc02d7e2SAndroid Build Coastguard Worker 
23*cc02d7e2SAndroid Build Coastguard Worker #include "src/compiler/config.h"
24*cc02d7e2SAndroid Build Coastguard Worker #include "src/compiler/generator_helpers.h"
25*cc02d7e2SAndroid Build Coastguard Worker #include "src/compiler/php_generator_helpers.h"
26*cc02d7e2SAndroid Build Coastguard Worker 
27*cc02d7e2SAndroid Build Coastguard Worker using google::protobuf::compiler::php::GeneratedClassName;
28*cc02d7e2SAndroid Build Coastguard Worker using grpc::protobuf::Descriptor;
29*cc02d7e2SAndroid Build Coastguard Worker using grpc::protobuf::FileDescriptor;
30*cc02d7e2SAndroid Build Coastguard Worker using grpc::protobuf::MethodDescriptor;
31*cc02d7e2SAndroid Build Coastguard Worker using grpc::protobuf::ServiceDescriptor;
32*cc02d7e2SAndroid Build Coastguard Worker using grpc::protobuf::io::Printer;
33*cc02d7e2SAndroid Build Coastguard Worker using grpc::protobuf::io::StringOutputStream;
34*cc02d7e2SAndroid Build Coastguard Worker using std::map;
35*cc02d7e2SAndroid Build Coastguard Worker 
36*cc02d7e2SAndroid Build Coastguard Worker namespace grpc_php_generator {
37*cc02d7e2SAndroid Build Coastguard Worker namespace {
38*cc02d7e2SAndroid Build Coastguard Worker 
ConvertToPhpNamespace(const std::string & name)39*cc02d7e2SAndroid Build Coastguard Worker std::string ConvertToPhpNamespace(const std::string& name) {
40*cc02d7e2SAndroid Build Coastguard Worker   std::vector<std::string> tokens = grpc_generator::tokenize(name, ".");
41*cc02d7e2SAndroid Build Coastguard Worker   std::ostringstream oss;
42*cc02d7e2SAndroid Build Coastguard Worker   for (unsigned int i = 0; i < tokens.size(); i++) {
43*cc02d7e2SAndroid Build Coastguard Worker     oss << (i == 0 ? "" : "\\")
44*cc02d7e2SAndroid Build Coastguard Worker         << grpc_generator::CapitalizeFirstLetter(tokens[i]);
45*cc02d7e2SAndroid Build Coastguard Worker   }
46*cc02d7e2SAndroid Build Coastguard Worker   return oss.str();
47*cc02d7e2SAndroid Build Coastguard Worker }
48*cc02d7e2SAndroid Build Coastguard Worker 
PackageName(const FileDescriptor * file)49*cc02d7e2SAndroid Build Coastguard Worker std::string PackageName(const FileDescriptor* file) {
50*cc02d7e2SAndroid Build Coastguard Worker   if (file->options().has_php_namespace()) {
51*cc02d7e2SAndroid Build Coastguard Worker     return file->options().php_namespace();
52*cc02d7e2SAndroid Build Coastguard Worker   } else {
53*cc02d7e2SAndroid Build Coastguard Worker     return ConvertToPhpNamespace(file->package());
54*cc02d7e2SAndroid Build Coastguard Worker   }
55*cc02d7e2SAndroid Build Coastguard Worker }
56*cc02d7e2SAndroid Build Coastguard Worker 
MessageIdentifierName(const std::string & name,const FileDescriptor * file)57*cc02d7e2SAndroid Build Coastguard Worker std::string MessageIdentifierName(const std::string& name,
58*cc02d7e2SAndroid Build Coastguard Worker                                   const FileDescriptor* file) {
59*cc02d7e2SAndroid Build Coastguard Worker   std::vector<std::string> tokens = grpc_generator::tokenize(name, ".");
60*cc02d7e2SAndroid Build Coastguard Worker   std::ostringstream oss;
61*cc02d7e2SAndroid Build Coastguard Worker   if (PackageName(file) != "") {
62*cc02d7e2SAndroid Build Coastguard Worker     oss << PackageName(file) << "\\";
63*cc02d7e2SAndroid Build Coastguard Worker   }
64*cc02d7e2SAndroid Build Coastguard Worker   oss << grpc_generator::CapitalizeFirstLetter(tokens[tokens.size() - 1]);
65*cc02d7e2SAndroid Build Coastguard Worker   return oss.str();
66*cc02d7e2SAndroid Build Coastguard Worker }
67*cc02d7e2SAndroid Build Coastguard Worker 
PrintMethod(const MethodDescriptor * method,Printer * out)68*cc02d7e2SAndroid Build Coastguard Worker void PrintMethod(const MethodDescriptor* method, Printer* out) {
69*cc02d7e2SAndroid Build Coastguard Worker   const Descriptor* input_type = method->input_type();
70*cc02d7e2SAndroid Build Coastguard Worker   const Descriptor* output_type = method->output_type();
71*cc02d7e2SAndroid Build Coastguard Worker   map<std::string, std::string> vars;
72*cc02d7e2SAndroid Build Coastguard Worker   vars["service_name"] = method->service()->full_name();
73*cc02d7e2SAndroid Build Coastguard Worker   vars["name"] = method->name();
74*cc02d7e2SAndroid Build Coastguard Worker   vars["input_type_id"] =
75*cc02d7e2SAndroid Build Coastguard Worker       MessageIdentifierName(GeneratedClassName(input_type), input_type->file());
76*cc02d7e2SAndroid Build Coastguard Worker   vars["output_type_id"] = MessageIdentifierName(
77*cc02d7e2SAndroid Build Coastguard Worker       GeneratedClassName(output_type), output_type->file());
78*cc02d7e2SAndroid Build Coastguard Worker 
79*cc02d7e2SAndroid Build Coastguard Worker   out->Print("/**\n");
80*cc02d7e2SAndroid Build Coastguard Worker   if (method->options().deprecated()) {
81*cc02d7e2SAndroid Build Coastguard Worker     out->Print(" * @deprecated\n");
82*cc02d7e2SAndroid Build Coastguard Worker   }
83*cc02d7e2SAndroid Build Coastguard Worker   out->Print(GetPHPComments(method, " *").c_str());
84*cc02d7e2SAndroid Build Coastguard Worker   if (method->client_streaming()) {
85*cc02d7e2SAndroid Build Coastguard Worker     if (method->server_streaming()) {
86*cc02d7e2SAndroid Build Coastguard Worker       vars["return_type_id"] = "\\Grpc\\BidiStreamingCall";
87*cc02d7e2SAndroid Build Coastguard Worker     } else {
88*cc02d7e2SAndroid Build Coastguard Worker       vars["return_type_id"] = "\\Grpc\\ClientStreamingCall";
89*cc02d7e2SAndroid Build Coastguard Worker     }
90*cc02d7e2SAndroid Build Coastguard Worker     out->Print(vars,
91*cc02d7e2SAndroid Build Coastguard Worker                " * @param array $$metadata metadata\n"
92*cc02d7e2SAndroid Build Coastguard Worker                " * @param array $$options call options\n"
93*cc02d7e2SAndroid Build Coastguard Worker                " * @return $return_type_id$\n */\n"
94*cc02d7e2SAndroid Build Coastguard Worker                "public function $name$($$metadata = [], "
95*cc02d7e2SAndroid Build Coastguard Worker                "$$options = []) {\n");
96*cc02d7e2SAndroid Build Coastguard Worker     out->Indent();
97*cc02d7e2SAndroid Build Coastguard Worker     out->Indent();
98*cc02d7e2SAndroid Build Coastguard Worker     if (method->server_streaming()) {
99*cc02d7e2SAndroid Build Coastguard Worker       out->Print("return $$this->_bidiRequest(");
100*cc02d7e2SAndroid Build Coastguard Worker     } else {
101*cc02d7e2SAndroid Build Coastguard Worker       out->Print("return $$this->_clientStreamRequest(");
102*cc02d7e2SAndroid Build Coastguard Worker     }
103*cc02d7e2SAndroid Build Coastguard Worker     out->Print(vars,
104*cc02d7e2SAndroid Build Coastguard Worker                "'/$service_name$/$name$',\n"
105*cc02d7e2SAndroid Build Coastguard Worker                "['\\$output_type_id$','decode'],\n"
106*cc02d7e2SAndroid Build Coastguard Worker                "$$metadata, $$options);\n");
107*cc02d7e2SAndroid Build Coastguard Worker   } else {
108*cc02d7e2SAndroid Build Coastguard Worker     if (method->server_streaming()) {
109*cc02d7e2SAndroid Build Coastguard Worker       vars["return_type_id"] = "\\Grpc\\ServerStreamingCall";
110*cc02d7e2SAndroid Build Coastguard Worker     } else {
111*cc02d7e2SAndroid Build Coastguard Worker       vars["return_type_id"] = "\\Grpc\\UnaryCall";
112*cc02d7e2SAndroid Build Coastguard Worker     }
113*cc02d7e2SAndroid Build Coastguard Worker     out->Print(vars,
114*cc02d7e2SAndroid Build Coastguard Worker                " * @param \\$input_type_id$ $$argument input argument\n"
115*cc02d7e2SAndroid Build Coastguard Worker                " * @param array $$metadata metadata\n"
116*cc02d7e2SAndroid Build Coastguard Worker                " * @param array $$options call options\n"
117*cc02d7e2SAndroid Build Coastguard Worker                " * @return $return_type_id$\n */\n"
118*cc02d7e2SAndroid Build Coastguard Worker                "public function $name$(\\$input_type_id$ $$argument,\n"
119*cc02d7e2SAndroid Build Coastguard Worker                "  $$metadata = [], $$options = []) {\n");
120*cc02d7e2SAndroid Build Coastguard Worker     out->Indent();
121*cc02d7e2SAndroid Build Coastguard Worker     out->Indent();
122*cc02d7e2SAndroid Build Coastguard Worker     if (method->server_streaming()) {
123*cc02d7e2SAndroid Build Coastguard Worker       out->Print("return $$this->_serverStreamRequest(");
124*cc02d7e2SAndroid Build Coastguard Worker     } else {
125*cc02d7e2SAndroid Build Coastguard Worker       out->Print("return $$this->_simpleRequest(");
126*cc02d7e2SAndroid Build Coastguard Worker     }
127*cc02d7e2SAndroid Build Coastguard Worker     out->Print(vars,
128*cc02d7e2SAndroid Build Coastguard Worker                "'/$service_name$/$name$',\n"
129*cc02d7e2SAndroid Build Coastguard Worker                "$$argument,\n"
130*cc02d7e2SAndroid Build Coastguard Worker                "['\\$output_type_id$', 'decode'],\n"
131*cc02d7e2SAndroid Build Coastguard Worker                "$$metadata, $$options);\n");
132*cc02d7e2SAndroid Build Coastguard Worker   }
133*cc02d7e2SAndroid Build Coastguard Worker   out->Outdent();
134*cc02d7e2SAndroid Build Coastguard Worker   out->Outdent();
135*cc02d7e2SAndroid Build Coastguard Worker   out->Print("}\n\n");
136*cc02d7e2SAndroid Build Coastguard Worker }
137*cc02d7e2SAndroid Build Coastguard Worker 
PrintServerMethod(const MethodDescriptor * method,Printer * out)138*cc02d7e2SAndroid Build Coastguard Worker void PrintServerMethod(const MethodDescriptor* method, Printer* out) {
139*cc02d7e2SAndroid Build Coastguard Worker   map<std::string, std::string> vars;
140*cc02d7e2SAndroid Build Coastguard Worker   const Descriptor* input_type = method->input_type();
141*cc02d7e2SAndroid Build Coastguard Worker   const Descriptor* output_type = method->output_type();
142*cc02d7e2SAndroid Build Coastguard Worker   vars["service_name"] = method->service()->full_name();
143*cc02d7e2SAndroid Build Coastguard Worker   vars["method_name"] = method->name();
144*cc02d7e2SAndroid Build Coastguard Worker   vars["input_type_id"] =
145*cc02d7e2SAndroid Build Coastguard Worker       MessageIdentifierName(GeneratedClassName(input_type), input_type->file());
146*cc02d7e2SAndroid Build Coastguard Worker   vars["output_type_id"] = MessageIdentifierName(
147*cc02d7e2SAndroid Build Coastguard Worker       GeneratedClassName(output_type), output_type->file());
148*cc02d7e2SAndroid Build Coastguard Worker 
149*cc02d7e2SAndroid Build Coastguard Worker   out->Print("/**\n");
150*cc02d7e2SAndroid Build Coastguard Worker   if (method->options().deprecated()) {
151*cc02d7e2SAndroid Build Coastguard Worker     out->Print(" * @deprecated\n");
152*cc02d7e2SAndroid Build Coastguard Worker   }
153*cc02d7e2SAndroid Build Coastguard Worker   out->Print(GetPHPComments(method, " *").c_str());
154*cc02d7e2SAndroid Build Coastguard Worker 
155*cc02d7e2SAndroid Build Coastguard Worker   const char* method_template;
156*cc02d7e2SAndroid Build Coastguard Worker   if (method->client_streaming() && method->server_streaming()) {
157*cc02d7e2SAndroid Build Coastguard Worker     method_template =
158*cc02d7e2SAndroid Build Coastguard Worker         " * @param \\Grpc\\ServerCallReader $$reader read client request data "
159*cc02d7e2SAndroid Build Coastguard Worker         "of \\$input_type_id$\n"
160*cc02d7e2SAndroid Build Coastguard Worker         " * @param \\Grpc\\ServerCallWriter $$writer write response data of "
161*cc02d7e2SAndroid Build Coastguard Worker         "\\$output_type_id$\n"
162*cc02d7e2SAndroid Build Coastguard Worker         " * @param \\Grpc\\ServerContext $$context server request context\n"
163*cc02d7e2SAndroid Build Coastguard Worker         " * @return void\n"
164*cc02d7e2SAndroid Build Coastguard Worker         " */\n"
165*cc02d7e2SAndroid Build Coastguard Worker         "public function $method_name$(\n"
166*cc02d7e2SAndroid Build Coastguard Worker         "    \\Grpc\\ServerCallReader $$reader,\n"
167*cc02d7e2SAndroid Build Coastguard Worker         "    \\Grpc\\ServerCallWriter $$writer,\n"
168*cc02d7e2SAndroid Build Coastguard Worker         "    \\Grpc\\ServerContext $$context\n"
169*cc02d7e2SAndroid Build Coastguard Worker         "): void {\n"
170*cc02d7e2SAndroid Build Coastguard Worker         "    $$context->setStatus(\\Grpc\\Status::unimplemented());\n"
171*cc02d7e2SAndroid Build Coastguard Worker         "    $$writer->finish();\n"
172*cc02d7e2SAndroid Build Coastguard Worker         "}\n\n";
173*cc02d7e2SAndroid Build Coastguard Worker   } else if (method->client_streaming()) {
174*cc02d7e2SAndroid Build Coastguard Worker     method_template =
175*cc02d7e2SAndroid Build Coastguard Worker         " * @param \\Grpc\\ServerCallReader $$reader read client request data "
176*cc02d7e2SAndroid Build Coastguard Worker         "of \\$input_type_id$\n"
177*cc02d7e2SAndroid Build Coastguard Worker         " * @param \\Grpc\\ServerContext $$context server request context\n"
178*cc02d7e2SAndroid Build Coastguard Worker         " * @return \\$output_type_id$ for response data, null if if error "
179*cc02d7e2SAndroid Build Coastguard Worker         "occured\n"
180*cc02d7e2SAndroid Build Coastguard Worker         " *     initial metadata (if any) and status (if not ok) should be set "
181*cc02d7e2SAndroid Build Coastguard Worker         "to $$context\n"
182*cc02d7e2SAndroid Build Coastguard Worker         " */\n"
183*cc02d7e2SAndroid Build Coastguard Worker         "public function $method_name$(\n"
184*cc02d7e2SAndroid Build Coastguard Worker         "    \\Grpc\\ServerCallReader $$reader,\n"
185*cc02d7e2SAndroid Build Coastguard Worker         "    \\Grpc\\ServerContext $$context\n"
186*cc02d7e2SAndroid Build Coastguard Worker         "): ?\\$output_type_id$ {\n"
187*cc02d7e2SAndroid Build Coastguard Worker         "    $$context->setStatus(\\Grpc\\Status::unimplemented());\n"
188*cc02d7e2SAndroid Build Coastguard Worker         "    return null;\n"
189*cc02d7e2SAndroid Build Coastguard Worker         "}\n\n";
190*cc02d7e2SAndroid Build Coastguard Worker   } else if (method->server_streaming()) {
191*cc02d7e2SAndroid Build Coastguard Worker     method_template =
192*cc02d7e2SAndroid Build Coastguard Worker         " * @param \\$input_type_id$ $$request client request\n"
193*cc02d7e2SAndroid Build Coastguard Worker         " * @param \\Grpc\\ServerCallWriter $$writer write response data of "
194*cc02d7e2SAndroid Build Coastguard Worker         "\\$output_type_id$\n"
195*cc02d7e2SAndroid Build Coastguard Worker         " * @param \\Grpc\\ServerContext $$context server request context\n"
196*cc02d7e2SAndroid Build Coastguard Worker         " * @return void\n"
197*cc02d7e2SAndroid Build Coastguard Worker         " */\n"
198*cc02d7e2SAndroid Build Coastguard Worker         "public function $method_name$(\n"
199*cc02d7e2SAndroid Build Coastguard Worker         "    \\$input_type_id$ $$request,\n"
200*cc02d7e2SAndroid Build Coastguard Worker         "    \\Grpc\\ServerCallWriter $$writer,\n"
201*cc02d7e2SAndroid Build Coastguard Worker         "    \\Grpc\\ServerContext $$context\n"
202*cc02d7e2SAndroid Build Coastguard Worker         "): void {\n"
203*cc02d7e2SAndroid Build Coastguard Worker         "    $$context->setStatus(\\Grpc\\Status::unimplemented());\n"
204*cc02d7e2SAndroid Build Coastguard Worker         "    $$writer->finish();\n"
205*cc02d7e2SAndroid Build Coastguard Worker         "}\n\n";
206*cc02d7e2SAndroid Build Coastguard Worker   } else {
207*cc02d7e2SAndroid Build Coastguard Worker     method_template =
208*cc02d7e2SAndroid Build Coastguard Worker         " * @param \\$input_type_id$ $$request client request\n"
209*cc02d7e2SAndroid Build Coastguard Worker         " * @param \\Grpc\\ServerContext $$context server request context\n"
210*cc02d7e2SAndroid Build Coastguard Worker         " * @return \\$output_type_id$ for response data, null if if error "
211*cc02d7e2SAndroid Build Coastguard Worker         "occured\n"
212*cc02d7e2SAndroid Build Coastguard Worker         " *     initial metadata (if any) and status (if not ok) should be set "
213*cc02d7e2SAndroid Build Coastguard Worker         "to $$context\n"
214*cc02d7e2SAndroid Build Coastguard Worker         " */\n"
215*cc02d7e2SAndroid Build Coastguard Worker         "public function $method_name$(\n"
216*cc02d7e2SAndroid Build Coastguard Worker         "    \\$input_type_id$ $$request,\n"
217*cc02d7e2SAndroid Build Coastguard Worker         "    \\Grpc\\ServerContext $$context\n"
218*cc02d7e2SAndroid Build Coastguard Worker         "): ?\\$output_type_id$ {\n"
219*cc02d7e2SAndroid Build Coastguard Worker         "    $$context->setStatus(\\Grpc\\Status::unimplemented());\n"
220*cc02d7e2SAndroid Build Coastguard Worker         "    return null;\n"
221*cc02d7e2SAndroid Build Coastguard Worker         "}\n\n";
222*cc02d7e2SAndroid Build Coastguard Worker   }
223*cc02d7e2SAndroid Build Coastguard Worker   out->Print(vars, method_template);
224*cc02d7e2SAndroid Build Coastguard Worker }
225*cc02d7e2SAndroid Build Coastguard Worker 
PrintServerMethodDescriptors(const ServiceDescriptor * service,Printer * out)226*cc02d7e2SAndroid Build Coastguard Worker void PrintServerMethodDescriptors(const ServiceDescriptor* service,
227*cc02d7e2SAndroid Build Coastguard Worker                                   Printer* out) {
228*cc02d7e2SAndroid Build Coastguard Worker   map<std::string, std::string> vars;
229*cc02d7e2SAndroid Build Coastguard Worker   vars["service_name"] = service->full_name();
230*cc02d7e2SAndroid Build Coastguard Worker 
231*cc02d7e2SAndroid Build Coastguard Worker   out->Print("/**\n");
232*cc02d7e2SAndroid Build Coastguard Worker   if (service->options().deprecated()) {
233*cc02d7e2SAndroid Build Coastguard Worker     out->Print(" * @deprecated\n");
234*cc02d7e2SAndroid Build Coastguard Worker   }
235*cc02d7e2SAndroid Build Coastguard Worker   out->Print(
236*cc02d7e2SAndroid Build Coastguard Worker       " * Get the method descriptors of the service for server registration\n"
237*cc02d7e2SAndroid Build Coastguard Worker       " *\n"
238*cc02d7e2SAndroid Build Coastguard Worker       " * @return array of \\Grpc\\MethodDescriptor for the service methods\n"
239*cc02d7e2SAndroid Build Coastguard Worker       " */\n"
240*cc02d7e2SAndroid Build Coastguard Worker       "public final function getMethodDescriptors(): array\n{\n");
241*cc02d7e2SAndroid Build Coastguard Worker   out->Indent();
242*cc02d7e2SAndroid Build Coastguard Worker   out->Indent();
243*cc02d7e2SAndroid Build Coastguard Worker   out->Print("return [\n");
244*cc02d7e2SAndroid Build Coastguard Worker   out->Indent();
245*cc02d7e2SAndroid Build Coastguard Worker   out->Indent();
246*cc02d7e2SAndroid Build Coastguard Worker   for (int i = 0; i < service->method_count(); i++) {
247*cc02d7e2SAndroid Build Coastguard Worker     auto method = service->method(i);
248*cc02d7e2SAndroid Build Coastguard Worker     auto input_type = method->input_type();
249*cc02d7e2SAndroid Build Coastguard Worker     vars["method_name"] = method->name();
250*cc02d7e2SAndroid Build Coastguard Worker     vars["input_type_id"] = MessageIdentifierName(
251*cc02d7e2SAndroid Build Coastguard Worker         GeneratedClassName(input_type), input_type->file());
252*cc02d7e2SAndroid Build Coastguard Worker     if (method->client_streaming() && method->server_streaming()) {
253*cc02d7e2SAndroid Build Coastguard Worker       vars["call_type"] = "BIDI_STREAMING_CALL";
254*cc02d7e2SAndroid Build Coastguard Worker     } else if (method->client_streaming()) {
255*cc02d7e2SAndroid Build Coastguard Worker       vars["call_type"] = "CLIENT_STREAMING_CALL";
256*cc02d7e2SAndroid Build Coastguard Worker     } else if (method->server_streaming()) {
257*cc02d7e2SAndroid Build Coastguard Worker       vars["call_type"] = "SERVER_STREAMING_CALL";
258*cc02d7e2SAndroid Build Coastguard Worker     } else {
259*cc02d7e2SAndroid Build Coastguard Worker       vars["call_type"] = "UNARY_CALL";
260*cc02d7e2SAndroid Build Coastguard Worker     }
261*cc02d7e2SAndroid Build Coastguard Worker     out->Print(
262*cc02d7e2SAndroid Build Coastguard Worker         vars,
263*cc02d7e2SAndroid Build Coastguard Worker         "'/$service_name$/$method_name$' => new \\Grpc\\MethodDescriptor(\n"
264*cc02d7e2SAndroid Build Coastguard Worker         "    $$this,\n"
265*cc02d7e2SAndroid Build Coastguard Worker         "    '$method_name$',\n"
266*cc02d7e2SAndroid Build Coastguard Worker         "    '\\$input_type_id$',\n"
267*cc02d7e2SAndroid Build Coastguard Worker         "    \\Grpc\\MethodDescriptor::$call_type$\n"
268*cc02d7e2SAndroid Build Coastguard Worker         "),\n");
269*cc02d7e2SAndroid Build Coastguard Worker   }
270*cc02d7e2SAndroid Build Coastguard Worker   out->Outdent();
271*cc02d7e2SAndroid Build Coastguard Worker   out->Outdent();
272*cc02d7e2SAndroid Build Coastguard Worker   out->Print("];\n");
273*cc02d7e2SAndroid Build Coastguard Worker   out->Outdent();
274*cc02d7e2SAndroid Build Coastguard Worker   out->Outdent();
275*cc02d7e2SAndroid Build Coastguard Worker   out->Print("}\n\n");
276*cc02d7e2SAndroid Build Coastguard Worker }
277*cc02d7e2SAndroid Build Coastguard Worker 
278*cc02d7e2SAndroid Build Coastguard Worker // Prints out the service descriptor object
PrintService(const ServiceDescriptor * service,const std::string & class_suffix,bool is_server,Printer * out)279*cc02d7e2SAndroid Build Coastguard Worker void PrintService(const ServiceDescriptor* service,
280*cc02d7e2SAndroid Build Coastguard Worker                   const std::string& class_suffix, bool is_server,
281*cc02d7e2SAndroid Build Coastguard Worker                   Printer* out) {
282*cc02d7e2SAndroid Build Coastguard Worker   map<std::string, std::string> vars;
283*cc02d7e2SAndroid Build Coastguard Worker   out->Print("/**\n");
284*cc02d7e2SAndroid Build Coastguard Worker   if (service->options().deprecated()) {
285*cc02d7e2SAndroid Build Coastguard Worker     out->Print(" * @deprecated\n");
286*cc02d7e2SAndroid Build Coastguard Worker   }
287*cc02d7e2SAndroid Build Coastguard Worker   out->Print(GetPHPComments(service, " *").c_str());
288*cc02d7e2SAndroid Build Coastguard Worker   out->Print(" */\n");
289*cc02d7e2SAndroid Build Coastguard Worker   vars["name"] = GetPHPServiceClassname(service, class_suffix, is_server);
290*cc02d7e2SAndroid Build Coastguard Worker   vars["extends"] = is_server ? "" : "extends \\Grpc\\BaseStub ";
291*cc02d7e2SAndroid Build Coastguard Worker   out->Print(vars, "class $name$ $extends${\n\n");
292*cc02d7e2SAndroid Build Coastguard Worker   out->Indent();
293*cc02d7e2SAndroid Build Coastguard Worker   out->Indent();
294*cc02d7e2SAndroid Build Coastguard Worker   if (!is_server) {
295*cc02d7e2SAndroid Build Coastguard Worker     out->Print(
296*cc02d7e2SAndroid Build Coastguard Worker         "/**\n * @param string $$hostname hostname\n"
297*cc02d7e2SAndroid Build Coastguard Worker         " * @param array $$opts channel options\n"
298*cc02d7e2SAndroid Build Coastguard Worker         " * @param \\Grpc\\Channel $$channel (optional) re-use channel object\n"
299*cc02d7e2SAndroid Build Coastguard Worker         " */\n"
300*cc02d7e2SAndroid Build Coastguard Worker         "public function __construct($$hostname, $$opts, "
301*cc02d7e2SAndroid Build Coastguard Worker         "$$channel = null) {\n");
302*cc02d7e2SAndroid Build Coastguard Worker     out->Indent();
303*cc02d7e2SAndroid Build Coastguard Worker     out->Indent();
304*cc02d7e2SAndroid Build Coastguard Worker     out->Print("parent::__construct($$hostname, $$opts, $$channel);\n");
305*cc02d7e2SAndroid Build Coastguard Worker     out->Outdent();
306*cc02d7e2SAndroid Build Coastguard Worker     out->Outdent();
307*cc02d7e2SAndroid Build Coastguard Worker     out->Print("}\n\n");
308*cc02d7e2SAndroid Build Coastguard Worker   }
309*cc02d7e2SAndroid Build Coastguard Worker   for (int i = 0; i < service->method_count(); i++) {
310*cc02d7e2SAndroid Build Coastguard Worker     if (is_server) {
311*cc02d7e2SAndroid Build Coastguard Worker       PrintServerMethod(service->method(i), out);
312*cc02d7e2SAndroid Build Coastguard Worker     } else {
313*cc02d7e2SAndroid Build Coastguard Worker       PrintMethod(service->method(i), out);
314*cc02d7e2SAndroid Build Coastguard Worker     }
315*cc02d7e2SAndroid Build Coastguard Worker   }
316*cc02d7e2SAndroid Build Coastguard Worker   if (is_server) {
317*cc02d7e2SAndroid Build Coastguard Worker     PrintServerMethodDescriptors(service, out);
318*cc02d7e2SAndroid Build Coastguard Worker   }
319*cc02d7e2SAndroid Build Coastguard Worker   out->Outdent();
320*cc02d7e2SAndroid Build Coastguard Worker   out->Outdent();
321*cc02d7e2SAndroid Build Coastguard Worker   out->Print("}\n");
322*cc02d7e2SAndroid Build Coastguard Worker }
323*cc02d7e2SAndroid Build Coastguard Worker }  // namespace
324*cc02d7e2SAndroid Build Coastguard Worker 
GenerateFile(const FileDescriptor * file,const ServiceDescriptor * service,const std::string & class_suffix,bool is_server)325*cc02d7e2SAndroid Build Coastguard Worker std::string GenerateFile(const FileDescriptor* file,
326*cc02d7e2SAndroid Build Coastguard Worker                          const ServiceDescriptor* service,
327*cc02d7e2SAndroid Build Coastguard Worker                          const std::string& class_suffix, bool is_server) {
328*cc02d7e2SAndroid Build Coastguard Worker   std::string output;
329*cc02d7e2SAndroid Build Coastguard Worker   {
330*cc02d7e2SAndroid Build Coastguard Worker     StringOutputStream output_stream(&output);
331*cc02d7e2SAndroid Build Coastguard Worker     Printer out(&output_stream, '$');
332*cc02d7e2SAndroid Build Coastguard Worker 
333*cc02d7e2SAndroid Build Coastguard Worker     out.Print("<?php\n");
334*cc02d7e2SAndroid Build Coastguard Worker     out.Print("// GENERATED CODE -- DO NOT EDIT!\n\n");
335*cc02d7e2SAndroid Build Coastguard Worker 
336*cc02d7e2SAndroid Build Coastguard Worker     std::string leading_comments = GetPHPComments(file, "//");
337*cc02d7e2SAndroid Build Coastguard Worker     if (!leading_comments.empty()) {
338*cc02d7e2SAndroid Build Coastguard Worker       out.Print("// Original file comments:\n");
339*cc02d7e2SAndroid Build Coastguard Worker       out.PrintRaw(leading_comments.c_str());
340*cc02d7e2SAndroid Build Coastguard Worker     }
341*cc02d7e2SAndroid Build Coastguard Worker 
342*cc02d7e2SAndroid Build Coastguard Worker     map<std::string, std::string> vars;
343*cc02d7e2SAndroid Build Coastguard Worker     std::string php_namespace = PackageName(file);
344*cc02d7e2SAndroid Build Coastguard Worker     vars["package"] = php_namespace;
345*cc02d7e2SAndroid Build Coastguard Worker     out.Print(vars, "namespace $package$;\n\n");
346*cc02d7e2SAndroid Build Coastguard Worker 
347*cc02d7e2SAndroid Build Coastguard Worker     PrintService(service, class_suffix, is_server, &out);
348*cc02d7e2SAndroid Build Coastguard Worker   }
349*cc02d7e2SAndroid Build Coastguard Worker   return output;
350*cc02d7e2SAndroid Build Coastguard Worker }
351*cc02d7e2SAndroid Build Coastguard Worker 
352*cc02d7e2SAndroid Build Coastguard Worker }  // namespace grpc_php_generator
353