Browse Source

Rework plugin to use the DescriptorSet model from SwiftProtobufPluginLibrary.

Tim Burks 8 năm trước cách đây
mục cha
commit
6e53474c85

+ 92 - 56
Plugin/Sources/protoc-gen-swiftgrpc/filters.swift

@@ -19,6 +19,8 @@ import SwiftProtobufPluginLibrary
 import Stencil
 import PathKit
 
+let namer = SwiftProtobufNamer()
+
 // internal helpers
 extension String {
   var undotted : String {
@@ -38,10 +40,8 @@ extension String {
 // functions for use in templates
 
 // Transform .some.package_name.FooBarRequest -> Some_PackageName_FooBarRequest
-func protoMessageName(_ name :String?) -> String {
-  guard let name = name else {
-    return ""
-  }
+func protoMessageName(_ descriptor :SwiftProtobufPluginLibrary.Descriptor) -> String {
+  let name = descriptor.fullName 
 
   var parts : [String] = []
   for dotComponent in name.components(separatedBy:".") {
@@ -62,19 +62,19 @@ func pathName(_ arguments: [Any?]) throws -> String {
   if arguments.count != 3 {
     throw TemplateSyntaxError("path expects 3 arguments")
   }
-  guard let protoFile = arguments[0] as? FileDescriptor
+  guard let protoFile = arguments[0] as? SwiftProtobufPluginLibrary.FileDescriptor
     else {
       throw TemplateSyntaxError("tag must be called with a " +
         "FileDescriptor" +
         " argument, received \(String(describing:arguments[0]))")
   }
-  guard let service = arguments[1] as? ServiceDescriptor
+  guard let service = arguments[1] as? SwiftProtobufPluginLibrary.ServiceDescriptor
     else {
       throw TemplateSyntaxError("tag must be called with a " +
         "ServiceDescriptor" +
         " argument, received \(String(describing:arguments[1]))")
   }
-  guard let method = arguments[2] as? MethodDescriptor
+  guard let method = arguments[2] as? SwiftProtobufPluginLibrary.MethodDescriptor
     else {
       throw TemplateSyntaxError("tag must be called with a " +
         "MethodDescriptor" +
@@ -87,19 +87,19 @@ func packageServiceMethodName(_ arguments: [Any?]) throws -> String {
   if arguments.count != 3 {
     throw TemplateSyntaxError("tag expects 3 arguments")
   }
-  guard let protoFile = arguments[0] as? FileDescriptor
+  guard let protoFile = arguments[0] as? SwiftProtobufPluginLibrary.FileDescriptor
     else {
       throw TemplateSyntaxError("tag must be called with a " +
         "FileDescriptor" +
         " argument, received \(String(describing:arguments[0]))")
   }
-  guard let service = arguments[1] as? ServiceDescriptor
+  guard let service = arguments[1] as? SwiftProtobufPluginLibrary.ServiceDescriptor
     else {
       throw TemplateSyntaxError("tag must be called with a " +
         "ServiceDescriptor" +
         " argument, received \(String(describing:arguments[1]))")
   }
-  guard let method = arguments[2] as? MethodDescriptor
+  guard let method = arguments[2] as? SwiftProtobufPluginLibrary.MethodDescriptor
     else {
       throw TemplateSyntaxError("tag must be called with a " +
         "MethodDescriptor" +
@@ -112,13 +112,13 @@ func packageServiceName(_ arguments: [Any?]) throws -> String {
   if arguments.count != 2 {
     throw TemplateSyntaxError("tag expects 2 arguments")
   }
-  guard let protoFile = arguments[0] as? FileDescriptor
+  guard let protoFile = arguments[0] as? SwiftProtobufPluginLibrary.FileDescriptor
     else {
       throw TemplateSyntaxError("tag must be called with a " +
         "FileDescriptor" +
         " argument, received \(String(describing:arguments[0]))")
   }
-  guard let service = arguments[1] as? ServiceDescriptor
+  guard let service = arguments[1] as? SwiftProtobufPluginLibrary.ServiceDescriptor
     else {
       throw TemplateSyntaxError("tag must be called with a " +
         "ServiceDescriptor" +
@@ -128,48 +128,84 @@ func packageServiceName(_ arguments: [Any?]) throws -> String {
 }
 
 class GRPCFilterExtension : Extension {
-	override init() {
-		super.init()
-	    // initialize template engine and add custom filters
-	    let ext = self
-	    ext.registerFilter("call") { (value: Any?, arguments: [Any?]) in
-	      return try packageServiceMethodName(arguments) + "Call"
-	    }
-	    ext.registerFilter("session") { (value: Any?, arguments: [Any?]) in
-	      return try packageServiceMethodName(arguments) + "Session"
-	    }
-	    ext.registerFilter("path") { (value: Any?, arguments: [Any?]) in
-	      return try pathName(arguments)
-	    }
-	    ext.registerFilter("provider") { (value: Any?, arguments: [Any?]) in
-	      return try packageServiceName(arguments) + "Provider"
-	    }
-	    ext.registerFilter("clienterror") { (value: Any?, arguments: [Any?]) in
-	      return try packageServiceName(arguments) + "ClientError"
-	    }
-	    ext.registerFilter("serviceclass") { (value: Any?, arguments: [Any?]) in
-	      return try packageServiceName(arguments) + "Service"
-	    }
-	    ext.registerFilter("servererror") { (value: Any?, arguments: [Any?]) in
-	      return try packageServiceName(arguments) + "ServerError"
-	    }
-	    ext.registerFilter("server") { (value: Any?, arguments: [Any?]) in
-	      return try packageServiceName(arguments) + "Server"
-	    }
-	    ext.registerFilter("service") { (value: Any?, arguments: [Any?]) in
-	      return try packageServiceName(arguments)
-	    }
-	    ext.registerFilter("input") { (value: Any?) in
-	      if let value = value as? MethodDescriptor {
-	        return protoMessageName(value.inputType)
-	      }
-	      throw TemplateSyntaxError("message: invalid argument \(String(describing:value))")
-	    }
-	    ext.registerFilter("output") { (value: Any?) in
-	      if let value = value as? MethodDescriptor {
-	        return protoMessageName(value.outputType)
-	      }
-	      throw TemplateSyntaxError("message: invalid argument \(String(describing:value))")
-	    }
-	}
+  override init() {
+    super.init()
+    // initialize template engine and add custom filters
+    let ext = self
+    ext.registerFilter("call") { (value: Any?, arguments: [Any?]) in
+      return try packageServiceMethodName(arguments) + "Call"
+    }
+    ext.registerFilter("session") { (value: Any?, arguments: [Any?]) in
+      return try packageServiceMethodName(arguments) + "Session"
+    }
+    ext.registerFilter("path") { (value: Any?, arguments: [Any?]) in
+      return try pathName(arguments)
+    }
+    ext.registerFilter("provider") { (value: Any?, arguments: [Any?]) in
+      return try packageServiceName(arguments) + "Provider"
+    }
+    ext.registerFilter("clienterror") { (value: Any?, arguments: [Any?]) in
+      return try packageServiceName(arguments) + "ClientError"
+    }
+    ext.registerFilter("serviceclass") { (value: Any?, arguments: [Any?]) in
+      return try packageServiceName(arguments) + "Service"
+    }
+    ext.registerFilter("servererror") { (value: Any?, arguments: [Any?]) in
+      return try packageServiceName(arguments) + "ServerError"
+    }
+    ext.registerFilter("server") { (value: Any?, arguments: [Any?]) in
+      return try packageServiceName(arguments) + "Server"
+    }
+    ext.registerFilter("service") { (value: Any?, arguments: [Any?]) in
+      return try packageServiceName(arguments)
+    }
+    ext.registerFilter("input") { (value: Any?) in
+      if let value = value as? SwiftProtobufPluginLibrary.MethodDescriptor {
+        return protoMessageName(value.inputType)
+      }
+      throw TemplateSyntaxError("message: invalid argument \(String(describing:value))")
+    }
+    ext.registerFilter("output") { (value: Any?) in
+      if let value = value as? SwiftProtobufPluginLibrary.MethodDescriptor {
+        return protoMessageName(value.outputType)
+      }
+      throw TemplateSyntaxError("message: invalid argument \(String(describing:value))")
+    }
+    ext.registerFilter("fileDescriptorName") { (value: Any?) in
+      if let value = value as? SwiftProtobufPluginLibrary.FileDescriptor {
+        return value.name
+      }
+      throw TemplateSyntaxError("message: invalid argument \(String(describing:value))")
+    }
+    ext.registerFilter("methodDescriptorName") { (value: Any?) in
+      if let value = value as? SwiftProtobufPluginLibrary.MethodDescriptor {
+        return value.name
+      }
+      throw TemplateSyntaxError("message: invalid argument \(String(describing:value))")
+    }
+    ext.registerFilter("methodIsUnary") { (value: Any?) in
+      if let value = value as? SwiftProtobufPluginLibrary.MethodDescriptor {
+        return !value.proto.clientStreaming && !value.proto.serverStreaming
+      }
+      throw TemplateSyntaxError("message: invalid argument \(String(describing:value))")
+    }
+    ext.registerFilter("methodIsServerStreaming") { (value: Any?) in
+      if let value = value as? SwiftProtobufPluginLibrary.MethodDescriptor {
+        return !value.proto.clientStreaming && value.proto.serverStreaming
+      }
+      throw TemplateSyntaxError("message: invalid argument \(String(describing:value))")
+    }
+    ext.registerFilter("methodIsClientStreaming") { (value: Any?) in
+      if let value = value as? SwiftProtobufPluginLibrary.MethodDescriptor {
+        return value.proto.clientStreaming && !value.proto.serverStreaming
+      }
+      throw TemplateSyntaxError("message: invalid argument \(String(describing:value))")
+    }
+    ext.registerFilter("methodIsBidiStreaming") { (value: Any?) in
+      if let value = value as? SwiftProtobufPluginLibrary.MethodDescriptor {
+        return value.proto.clientStreaming && value.proto.serverStreaming
+      }
+      throw TemplateSyntaxError("message: invalid argument \(String(describing:value))")
+    }
+  }
 }

+ 20 - 17
Plugin/Sources/protoc-gen-swiftgrpc/main.swift

@@ -58,38 +58,41 @@ func main() throws {
   let request = try Google_Protobuf_Compiler_CodeGeneratorRequest(serializedData: rawRequest)
   
   let options = try GeneratorOptions(parameter: request.parameter)
-  
+
+  // Build the SwiftProtobufPluginLibrary model of the plugin input
+  let descriptorSet = DescriptorSet(protos: request.protoFile)
+
   var generatedFileNames = Set<String>()
   var clientCount = 0
 
   // process each .proto file separately
-  for protoFile in request.protoFile {
-
-    let file = FileDescriptor(proto:protoFile)
+  for fileDescriptor in descriptorSet.files {
 
     // log info about the service
-    log += "File \(file.name)\n"
-    for service in file.service {
-      log += "Service \(service.name)\n"
-      for method in service.method {
-        log += " Method \(method.name)\n"
-        log += "  input \(method.inputType)\n"
-        log += "  output \(method.outputType)\n"
-        log += "  client_streaming \(method.clientStreaming)\n"
-        log += "  server_streaming \(method.serverStreaming)\n"
+    log += "File \(fileDescriptor.name)\n"
+    for serviceDescriptor in fileDescriptor.services {
+      log += "Service \(serviceDescriptor.name)\n"
+      for methodDescriptor in serviceDescriptor.methods {
+        log += " Method \(methodDescriptor.name)\n"
+        log += "  input \(methodDescriptor.inputType.name)\n"
+        log += "  output \(methodDescriptor.outputType.name)\n"
+        log += "  client_streaming \(methodDescriptor.proto.clientStreaming)\n"
+        log += "  server_streaming \(methodDescriptor.proto.serverStreaming)\n"
       }
     }
 
-    if file.service.count > 0 {
+    if fileDescriptor.services.count > 0 {
       // a package declaration is required for file containing service(s)
-      let package = file.package
+      let package = fileDescriptor.package
       guard package != ""  else {
-        print("ERROR: no package for \(file.name)")
+        print("ERROR: no package for \(fileDescriptor.name)")
         continue
       }
       
       // generate separate implementation files for client and server
-      let context : [String:Any] = ["file": file, "access": options.visibility.sourceSnippet]
+      let context : [String:Any] = [
+        "file": fileDescriptor,
+        "access": options.visibility.sourceSnippet]
 
       do {
         var clientFileName : String

+ 0 - 63
Plugin/Sources/protoc-gen-swiftgrpc/models.swift

@@ -1,63 +0,0 @@
-/*
- * Copyright 2017, gRPC Authors All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import Foundation
-import SwiftProtobuf
-import SwiftProtobufPluginLibrary
-import Stencil
-import PathKit
-
-struct FileDescriptor {
-  var name : String
-  var package : String
-  var service: [ServiceDescriptor] = []
-
-  init(proto: Google_Protobuf_FileDescriptorProto) {
-    name = proto.name
-    package = proto.package
-    for service in proto.service {
-      self.service.append(ServiceDescriptor(proto:service))
-    }
-  }
-}
-
-struct ServiceDescriptor {
-  var name : String
-  var method : [MethodDescriptor] = []
-
-  init(proto: Google_Protobuf_ServiceDescriptorProto) {
-    name = proto.name
-    for method in proto.method {
-      self.method.append(MethodDescriptor(proto:method))
-    }
-  }
-}
-
-struct MethodDescriptor {
-  var name : String
-  var inputType : String
-  var outputType : String
-  var clientStreaming : Bool
-  var serverStreaming : Bool
-
-  init(proto: Google_Protobuf_MethodDescriptorProto) {
-    name = proto.name
-    inputType = proto.inputType
-    outputType = proto.outputType
-    clientStreaming = proto.clientStreaming
-    serverStreaming = proto.serverStreaming
-  }
-}
-

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
Plugin/Sources/protoc-gen-swiftgrpc/templates.swift


+ 1 - 1
Plugin/Templates/client-call-bidistreaming.swift

@@ -1,4 +1,4 @@
-/// {{ method.name }} (Bidirectional Streaming)
+/// {{ method|methodDescriptorName }} (Bidirectional Streaming)
 {{ access }} class {{ .|call:file,service,method }} {
   private var call : Call
 

+ 1 - 1
Plugin/Templates/client-call-clientstreaming.swift

@@ -1,4 +1,4 @@
-/// {{ method.name }} (Client Streaming)
+/// {{ method|methodDescriptorName }} (Client Streaming)
 {{ access }} class {{ .|call:file,service,method }} {
   private var call : Call
 

+ 1 - 1
Plugin/Templates/client-call-serverstreaming.swift

@@ -1,4 +1,4 @@
-/// {{ method.name }} (Server Streaming)
+/// {{ method|methodDescriptorName }} (Server Streaming)
 {{ access }} class {{ .|call:file,service,method }} {
   private var call : Call
 

+ 1 - 1
Plugin/Templates/client-call-unary.swift

@@ -1,4 +1,4 @@
-/// {{ method.name }} (Unary)
+/// {{ method|methodDescriptorName }} (Unary)
 {{ access }} class {{ .|call:file,service,method }} {
   private var call : Call
 

+ 17 - 17
Plugin/Templates/client.pb.swift

@@ -2,7 +2,7 @@
  * DO NOT EDIT.
  *
  * Generated by the protocol buffer compiler.
- * Source: {{ file.name }}
+ * Source: {{ file|fileDescriptorName }}
  *
  */
 
@@ -25,7 +25,7 @@ import Foundation
 import Dispatch
 import gRPC
 import SwiftProtobuf
-//-{% for service in file.service %}
+//-{% for service in file.services %}
 
 /// Type for errors thrown from generated client code.
 {{ access }} enum {{ .|clienterror:file,service }} : Error {
@@ -34,17 +34,17 @@ import SwiftProtobuf
   case error(c: CallResult)
 }
 
-//-{% for method in service.method %}
-//-{% if not method.clientStreaming and not method.serverStreaming %}
+//-{% for method in service.methods %}
+//-{% if method|methodIsUnary %}
 //-{% include "client-call-unary.swift" %}
 //-{% endif %}
-//-{% if not method.clientStreaming and method.serverStreaming %}
+//-{% if method|methodIsServerStreaming %}
 //-{% include "client-call-serverstreaming.swift" %}
 //-{% endif %}
-//-{% if method.clientStreaming and not method.serverStreaming %}
+//-{% if method|methodIsClientStreaming %}
 //-{% include "client-call-clientstreaming.swift" %}
 //-{% endif %}
-//-{% if method.clientStreaming and method.serverStreaming %}
+//-{% if method|methodIsBidiStreaming %}
 //-{% include "client-call-bidistreaming.swift" %}
 //-{% endif %}
 //-{% endfor %}
@@ -81,16 +81,16 @@ import SwiftProtobuf
     metadata = Metadata()
   }
 
-  //-{% for method in service.method %}
-  //-{% if not method.clientStreaming and not method.serverStreaming %}
+  //-{% for method in service.methods %}
+  //-{% if method|methodIsUnary %}
   /// Synchronous. Unary.
-  {{ access }} func {{ method.name|lowercase }}(_ request: {{ method|input }})
+  {{ access }} func {{ method|methodDescriptorName|lowercase }}(_ request: {{ method|input }})
     throws
     -> {{ method|output }} {
       return try {{ .|call:file,service,method }}(channel).run(request:request, metadata:metadata)
   }
   /// Asynchronous. Unary.
-  {{ access }} func {{ method.name|lowercase }}(_ request: {{ method|input }},
+  {{ access }} func {{ method|methodDescriptorName|lowercase }}(_ request: {{ method|input }},
                   completion: @escaping ({{ method|output }}?, CallResult)->())
     throws
     -> {{ .|call:file,service,method }} {
@@ -99,31 +99,31 @@ import SwiftProtobuf
                                                  completion:completion)
   }
   //-{% endif %}
-  //-{% if not method.clientStreaming and method.serverStreaming %}
+  //-{% if method|methodIsServerStreaming %}
   /// Asynchronous. Server-streaming.
   /// Send the initial message.
   /// Use methods on the returned object to get streamed responses.
-  {{ access }} func {{ method.name|lowercase }}(_ request: {{ method|input }}, completion: @escaping (CallResult)->())
+  {{ access }} func {{ method|methodDescriptorName|lowercase }}(_ request: {{ method|input }}, completion: @escaping (CallResult)->())
     throws
     -> {{ .|call:file,service,method }} {
       return try {{ .|call:file,service,method }}(channel).start(request:request, metadata:metadata, completion:completion)
   }
   //-{% endif %}
-  //-{% if method.clientStreaming and not method.serverStreaming %}
+  //-{% if method|methodIsClientStreaming %}
   /// Asynchronous. Client-streaming.
   /// Use methods on the returned object to stream messages and
   /// to close the connection and wait for a final response.
-  {{ access }} func {{ method.name|lowercase }}(completion: @escaping (CallResult)->())
+  {{ access }} func {{ method|methodDescriptorName|lowercase }}(completion: @escaping (CallResult)->())
     throws
     -> {{ .|call:file,service,method }} {
       return try {{ .|call:file,service,method }}(channel).start(metadata:metadata, completion:completion)
   }
   //-{% endif %}
-  //-{% if method.clientStreaming and method.serverStreaming %}
+  //-{% if method|methodIsBidiStreaming %}
   /// Asynchronous. Bidirectional-streaming.
   /// Use methods on the returned object to stream messages,
   /// to wait for replies, and to close the connection.
-  {{ access }} func {{ method.name|lowercase }}(completion: @escaping (CallResult)->())
+  {{ access }} func {{ method|methodDescriptorName|lowercase }}(completion: @escaping (CallResult)->())
     throws
     -> {{ .|call:file,service,method }} {
       return try {{ .|call:file,service,method }}(channel).start(metadata:metadata, completion:completion)

+ 2 - 2
Plugin/Templates/server-session-bidistreaming.swift

@@ -1,4 +1,4 @@
-// {{ method.name }} (Bidirectional Streaming)
+// {{ method|methodDescriptorName }} (Bidirectional Streaming)
 {{ access }} class {{ .|session:file,service,method }} : {{ .|service:file,service }}Session {
   private var provider : {{ .|provider:file,service }}
 
@@ -51,7 +51,7 @@
     try self.handler.sendMetadata(initialMetadata:initialMetadata) {
       queue.async {
         do {
-          try self.provider.{{ method.name|lowercase }}(session:self)
+          try self.provider.{{ method|methodDescriptorName|lowercase }}(session:self)
         } catch (let error) {
           print("error \(error)")
         }

+ 2 - 2
Plugin/Templates/server-session-clientstreaming.swift

@@ -1,4 +1,4 @@
-// {{ method.name }} (Client Streaming)
+// {{ method|methodDescriptorName }} (Client Streaming)
 {{ access }} class {{ .|session:file,service,method }} : {{ .|service:file,service }}Session {
   private var provider : {{ .|provider:file,service }}
 
@@ -38,7 +38,7 @@
     try self.handler.sendMetadata(initialMetadata:initialMetadata) {
       queue.async {
         do {
-          try self.provider.{{ method.name|lowercase }}(session:self)
+          try self.provider.{{ method|methodDescriptorName|lowercase }}(session:self)
         } catch (let error) {
           print("error \(error)")
         }

+ 2 - 2
Plugin/Templates/server-session-serverstreaming.swift

@@ -1,4 +1,4 @@
-// {{ method.name }} (Server Streaming)
+// {{ method|methodDescriptorName }} (Server Streaming)
 {{ access }} class {{ .|session:file,service,method }} : {{ .|service:file,service }}Session {
   private var provider : {{ .|provider:file,service }}
 
@@ -23,7 +23,7 @@
           // we dispatch them to another queue.
           queue.async {
             do {
-              try self.provider.{{ method.name|lowercase }}(request:requestMessage, session: self)
+              try self.provider.{{ method|methodDescriptorName|lowercase }}(request:requestMessage, session: self)
               try self.handler.sendStatus(statusCode:self.statusCode,
                                           statusMessage:self.statusMessage,
                                           trailingMetadata:self.trailingMetadata,

+ 2 - 2
Plugin/Templates/server-session-unary.swift

@@ -1,4 +1,4 @@
-// {{ method.name }} (Unary)
+// {{ method|methodDescriptorName }} (Unary)
 {{ access }} class {{ .|session:file,service,method }} : {{ .|service:file,service }}Session {
   private var provider : {{ .|provider:file,service }}
 
@@ -13,7 +13,7 @@
     try handler.receiveMessage(initialMetadata:initialMetadata) {(requestData) in
       if let requestData = requestData {
         let requestMessage = try {{ method|input }}(serializedData:requestData)
-        let replyMessage = try self.provider.{{ method.name|lowercase }}(request:requestMessage, session: self)
+        let replyMessage = try self.provider.{{ method|methodDescriptorName|lowercase }}(request:requestMessage, session: self)
         try self.handler.sendResponse(message:replyMessage.serializedData(),
                                       statusCode:self.statusCode,
                                       statusMessage:self.statusMessage,

+ 17 - 17
Plugin/Templates/server.pb.swift

@@ -2,7 +2,7 @@
  * DO NOT EDIT.
  *
  * Generated by the protocol buffer compiler.
- * Source: {{ file.name }}
+ * Source: {{ file|fileDescriptorName }}
  *
  */
 
@@ -25,7 +25,7 @@ import Foundation
 import Dispatch
 import gRPC
 import SwiftProtobuf
-//-{% for service in file.service %}
+//-{% for service in file.services %}
 
 /// Type for errors thrown from generated server code.
 {{ access }} enum {{ .|servererror:file,service }} : Error {
@@ -34,18 +34,18 @@ import SwiftProtobuf
 
 /// To build a server, implement a class that conforms to this protocol.
 {{ access }} protocol {{ .|provider:file,service }} {
-  //-{% for method in service.method %}
-  //-{% if not method.clientStreaming and not method.serverStreaming %}
-  func {{ method.name|lowercase }}(request : {{ method|input }}, session : {{ .|session:file,service,method }}) throws -> {{ method|output }}
+  //-{% for method in service.methods %}
+  //-{% if method|methodIsUnary %}
+  func {{ method|methodDescriptorName|lowercase }}(request : {{ method|input }}, session : {{ .|session:file,service,method }}) throws -> {{ method|output }}
   //-{% endif %}
-  //-{% if not method.clientStreaming and method.serverStreaming %}
-  func {{ method.name|lowercase }}(request : {{ method|input }}, session : {{ .|session:file,service,method }}) throws
+  //-{% if method|methodIsServerStreaming %}
+  func {{ method|methodDescriptorName|lowercase }}(request : {{ method|input }}, session : {{ .|session:file,service,method }}) throws
   //-{% endif %}
-  //-{% if method.clientStreaming and not method.serverStreaming %}
-  func {{ method.name|lowercase }}(session : {{ .|session:file,service,method }}) throws
+  //-{% if method|methodIsClientStreaming %}
+  func {{ method|methodDescriptorName|lowercase }}(session : {{ .|session:file,service,method }}) throws
   //-{% endif %}
-  //-{% if method.clientStreaming and method.serverStreaming %}
-  func {{ method.name|lowercase }}(session : {{ .|session:file,service,method }}) throws
+  //-{% if method|methodIsBidiStreaming %}
+  func {{ method|methodDescriptorName|lowercase }}(session : {{ .|session:file,service,method }}) throws
   //-{% endif %}
   //-{% endfor %}
 }
@@ -65,17 +65,17 @@ import SwiftProtobuf
   }
 }
 
-//-{% for method in service.method %}
-//-{% if not method.clientStreaming and not method.serverStreaming %}
+//-{% for method in service.methods %}
+//-{% if method|methodIsUnary %}
 //-{% include "server-session-unary.swift" %}
 //-{% endif %}
-//-{% if not method.clientStreaming and method.serverStreaming %}
+//-{% if method|methodIsServerStreaming %}
 //-{% include "server-session-serverstreaming.swift" %}
 //-{% endif %}
-//-{% if method.clientStreaming and not method.serverStreaming %}
+//-{% if method|methodIsClientStreaming %}
 //-{% include "server-session-clientstreaming.swift" %}
 //-{% endif %}
-//-{% if method.clientStreaming and method.serverStreaming %}
+//-{% if method|methodIsBidiStreaming %}
 //-{% include "server-session-bidistreaming.swift" %}
 //-{% endif %}
 //-{% endfor %}
@@ -125,7 +125,7 @@ import SwiftProtobuf
 
       do {
         switch handler.method {
-        //-{% for method in service.method %}
+        //-{% for method in service.methods %}
         case "{{ .|path:file,service,method }}":
           try {{ .|session:file,service,method }}(handler:handler, provider:provider).run(queue:queue)
         //-{% endfor %}

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác