aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/compiler/objective_c_generator.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler/objective_c_generator.cc')
-rw-r--r--src/compiler/objective_c_generator.cc100
1 files changed, 96 insertions, 4 deletions
diff --git a/src/compiler/objective_c_generator.cc b/src/compiler/objective_c_generator.cc
index 39f68cb956..af5398ec68 100644
--- a/src/compiler/objective_c_generator.cc
+++ b/src/compiler/objective_c_generator.cc
@@ -113,6 +113,29 @@ void PrintAdvancedSignature(Printer* printer, const MethodDescriptor* method,
PrintMethodSignature(printer, method, vars);
}
+void PrintV2Signature(Printer* printer, const MethodDescriptor* method,
+ map< ::grpc::string, ::grpc::string> vars) {
+ if (method->client_streaming()) {
+ vars["return_type"] = "GRPCStreamingProtoCall *";
+ } else {
+ vars["return_type"] = "GRPCUnaryProtoCall *";
+ }
+ vars["method_name"] =
+ grpc_generator::LowercaseFirstLetter(vars["method_name"]);
+
+ PrintAllComments(method, printer);
+
+ printer->Print(vars, "- ($return_type$)$method_name$With");
+ if (method->client_streaming()) {
+ printer->Print("ResponseHandler:(id<GRPCProtoResponseHandler>)handler");
+ } else {
+ printer->Print(vars,
+ "Message:($request_class$ *)message "
+ "responseHandler:(id<GRPCProtoResponseHandler>)handler");
+ }
+ printer->Print(" callOptions:(GRPCCallOptions *_Nullable)callOptions");
+}
+
inline map< ::grpc::string, ::grpc::string> GetMethodVars(
const MethodDescriptor* method) {
map< ::grpc::string, ::grpc::string> res;
@@ -135,6 +158,16 @@ void PrintMethodDeclarations(Printer* printer, const MethodDescriptor* method) {
printer->Print(";\n\n\n");
}
+void PrintV2MethodDeclarations(Printer* printer,
+ const MethodDescriptor* method) {
+ map< ::grpc::string, ::grpc::string> vars = GetMethodVars(method);
+
+ PrintProtoRpcDeclarationAsPragma(printer, method, vars);
+
+ PrintV2Signature(printer, method, vars);
+ printer->Print(";\n\n");
+}
+
void PrintSimpleImplementation(Printer* printer, const MethodDescriptor* method,
map< ::grpc::string, ::grpc::string> vars) {
printer->Print("{\n");
@@ -177,6 +210,25 @@ void PrintAdvancedImplementation(Printer* printer,
printer->Print("}\n");
}
+void PrintV2Implementation(Printer* printer, const MethodDescriptor* method,
+ map< ::grpc::string, ::grpc::string> vars) {
+ printer->Print(" {\n");
+ if (method->client_streaming()) {
+ printer->Print(vars, " return [self RPCToMethod:@\"$method_name$\"\n");
+ printer->Print(" responseHandler:handler\n");
+ printer->Print(" callOptions:callOptions\n");
+ printer->Print(
+ vars, " responseClass:[$response_class$ class]];\n}\n\n");
+ } else {
+ printer->Print(vars, " return [self RPCToMethod:@\"$method_name$\"\n");
+ printer->Print(" message:message\n");
+ printer->Print(" responseHandler:handler\n");
+ printer->Print(" callOptions:callOptions\n");
+ printer->Print(
+ vars, " responseClass:[$response_class$ class]];\n}\n\n");
+ }
+}
+
void PrintMethodImplementations(Printer* printer,
const MethodDescriptor* method) {
map< ::grpc::string, ::grpc::string> vars = GetMethodVars(method);
@@ -184,12 +236,16 @@ void PrintMethodImplementations(Printer* printer,
PrintProtoRpcDeclarationAsPragma(printer, method, vars);
// TODO(jcanizales): Print documentation from the method.
+ printer->Print("// Deprecated methods.\n");
PrintSimpleSignature(printer, method, vars);
PrintSimpleImplementation(printer, method, vars);
printer->Print("// Returns a not-yet-started RPC object.\n");
PrintAdvancedSignature(printer, method, vars);
PrintAdvancedImplementation(printer, method, vars);
+
+ PrintV2Signature(printer, method, vars);
+ PrintV2Implementation(printer, method, vars);
}
} // namespace
@@ -231,6 +287,25 @@ void PrintMethodImplementations(Printer* printer,
return output;
}
+::grpc::string GetV2Protocol(const ServiceDescriptor* service) {
+ ::grpc::string output;
+
+ // Scope the output stream so it closes and finalizes output to the string.
+ grpc::protobuf::io::StringOutputStream output_stream(&output);
+ Printer printer(&output_stream, '$');
+
+ map< ::grpc::string, ::grpc::string> vars = {
+ {"service_class", ServiceClassName(service) + "2"}};
+
+ printer.Print(vars, "@protocol $service_class$ <NSObject>\n\n");
+ for (int i = 0; i < service->method_count(); i++) {
+ PrintV2MethodDeclarations(&printer, service->method(i));
+ }
+ printer.Print("@end\n\n");
+
+ return output;
+}
+
::grpc::string GetInterface(const ServiceDescriptor* service) {
::grpc::string output;
@@ -248,10 +323,16 @@ void PrintMethodImplementations(Printer* printer,
" */\n");
printer.Print(vars,
"@interface $service_class$ :"
- " GRPCProtoService<$service_class$>\n");
+ " GRPCProtoService<$service_class$, $service_class$2>\n");
printer.Print(
- "- (instancetype)initWithHost:(NSString *)host"
+ "- (instancetype)initWithHost:(NSString *)host "
+ "callOptions:(GRPCCallOptions "
+ "*_Nullable)callOptions"
" NS_DESIGNATED_INITIALIZER;\n");
+ printer.Print("- (instancetype)initWithHost:(NSString *)host;\n");
+ printer.Print(
+ "+ (instancetype)serviceWithHost:(NSString *)host "
+ "callOptions:(GRPCCallOptions *_Nullable)callOptions;\n");
printer.Print("+ (instancetype)serviceWithHost:(NSString *)host;\n");
printer.Print("@end\n");
@@ -273,11 +354,18 @@ void PrintMethodImplementations(Printer* printer,
printer.Print(vars,
"@implementation $service_class$\n\n"
"// Designated initializer\n"
- "- (instancetype)initWithHost:(NSString *)host {\n"
+ "- (instancetype)initWithHost:(NSString *)host "
+ "callOptions:(GRPCCallOptions *_Nullable)callOptions {\n"
" self = [super initWithHost:host\n"
" packageName:@\"$package$\"\n"
- " serviceName:@\"$service_name$\"];\n"
+ " serviceName:@\"$service_name$\"\n"
+ " callOptions:callOptions];\n"
" return self;\n"
+ "}\n\n"
+ "- (instancetype)initWithHost:(NSString *)host {\n"
+ " return [super initWithHost:host\n"
+ " packageName:@\"$package$\"\n"
+ " serviceName:@\"$service_name$\"];\n"
"}\n\n");
printer.Print(
@@ -293,6 +381,10 @@ void PrintMethodImplementations(Printer* printer,
"#pragma mark - Class Methods\n\n"
"+ (instancetype)serviceWithHost:(NSString *)host {\n"
" return [[self alloc] initWithHost:host];\n"
+ "}\n\n"
+ "+ (instancetype)serviceWithHost:(NSString *)host "
+ "callOptions:(GRPCCallOptions *_Nullable)callOptions {\n"
+ " return [[self alloc] initWithHost:host callOptions:callOptions];\n"
"}\n\n");
printer.Print("#pragma mark - Method Implementations\n\n");