Quellcode durchsuchen

Update plugin for Swift 3.1 code generation

This required some extensive changes to template processing.
Alongside the Swift 3.0->3.1 update, the Swift Protocol Buffer
project changed the representation of "proto2" format messages
so that message fields no longer have fields in the generated
structures. This breaks the introspection that Stencil uses
during template rendering, so to fix this, we introduce an
intermediate structure.
Tim Burks vor 8 Jahren
Ursprung
Commit
bcf716c361

+ 1 - 1
Examples/Echo/PackageManager/Package.swift

@@ -35,6 +35,6 @@ let package = Package (
     name: "Echo",
     dependencies: [
         .Package(url: "https://github.com/grpc/grpc-swift.git", Version(0,1,10)),
-        .Package(url: "https://github.com/timburks/swift-protobuf.git", Version(0,9,30)),
+        .Package(url: "https://github.com/apple/swift-protobuf.git", Version(0,9,29)),
     ]
 )

+ 2 - 2
Plugin/Makefile

@@ -10,8 +10,8 @@ build:  clear
 
 test:	build
 	protoc ../Examples/Echo/echo.proto --proto_path=../Examples/Echo --plugin=./protoc-gen-swiftgrpc --swiftgrpc_out=. 
-#	diff echo.client.pb.swift ../Examples/Echo/Generated/echo.client.pb.swift
-#	diff echo.server.pb.swift ../Examples/Echo/Generated/echo.server.pb.swift
+	diff echo.client.pb.swift ../Examples/Echo/Generated/echo.client.pb.swift
+	diff echo.server.pb.swift ../Examples/Echo/Generated/echo.server.pb.swift
 
 deploy:
 	cp echo.client.pb.swift ../Examples/Echo/Generated/echo.client.pb.swift 

+ 1 - 1
Plugin/Package.swift

@@ -43,6 +43,6 @@ let package = Package(
   ],
   dependencies: [
     .Package(url: "https://github.com/apple/swift-protobuf.git", Version(0,9,29)),
-    .Package(url: "https://github.com/kylef/Stencil.git", Version(0,8,0))
+    .Package(url: "https://github.com/timburks/Stencil.git", Version(0,8,1))
   ]
 )

+ 186 - 0
Plugin/Sources/protoc-gen-swiftgrpc/filters.swift

@@ -0,0 +1,186 @@
+/*
+ *
+ * Copyright 2017, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+import Foundation
+import SwiftProtobuf
+import PluginLibrary
+import Stencil
+import PathKit
+
+// internal helpers
+extension String {
+  var undotted : String {
+    return self.replacingOccurrences(of:".", with:"_")
+  }
+
+  var uppercasedFirst : String {
+    var out = self.characters
+    if let first = out.popFirst() {
+      return String(first).uppercased() + String(out)
+    } else {
+      return self
+    }
+  }
+}
+
+// functions for use in templates
+
+func protoMessageName(_ name :String?) -> String {
+  guard let name = name else {
+    return ""
+  }
+  let parts = name.undotted.components(separatedBy:"_")
+  var capitalizedParts : [String] = []
+  for part in parts {
+    if part != "" {
+      capitalizedParts.append(part.uppercasedFirst)
+    }
+  }
+  return capitalizedParts.joined(separator:"_")
+}
+
+func pathName(_ arguments: [Any?]) throws -> String {
+  if arguments.count != 3 {
+    throw TemplateSyntaxError("path expects 3 arguments")
+  }
+  guard let protoFile = arguments[0] as? FileDescriptor
+    else {
+      throw TemplateSyntaxError("tag must be called with a " +
+        "FileDescriptor" +
+        " argument, received \(String(describing:arguments[0]))")
+  }
+  guard let service = arguments[1] as? ServiceDescriptor
+    else {
+      throw TemplateSyntaxError("tag must be called with a " +
+        "ServiceDescriptor" +
+        " argument, received \(String(describing:arguments[1]))")
+  }
+  guard let method = arguments[2] as? MethodDescriptor
+    else {
+      throw TemplateSyntaxError("tag must be called with a " +
+        "MethodDescriptor" +
+        " argument, received \(String(describing:arguments[2]))")
+  }
+  return "/" + protoFile.package + "." + service.name + "/" + method.name
+}
+
+func packageServiceMethodName(_ arguments: [Any?]) throws -> String {
+  if arguments.count != 3 {
+    throw TemplateSyntaxError("tag expects 3 arguments")
+  }
+  guard let protoFile = arguments[0] as? FileDescriptor
+    else {
+      throw TemplateSyntaxError("tag must be called with a " +
+        "FileDescriptor" +
+        " argument, received \(String(describing:arguments[0]))")
+  }
+  guard let service = arguments[1] as? ServiceDescriptor
+    else {
+      throw TemplateSyntaxError("tag must be called with a " +
+        "ServiceDescriptor" +
+        " argument, received \(String(describing:arguments[1]))")
+  }
+  guard let method = arguments[2] as? MethodDescriptor
+    else {
+      throw TemplateSyntaxError("tag must be called with a " +
+        "MethodDescriptor" +
+        " argument, received \(String(describing:arguments[2]))")
+  }
+  return protoFile.package.capitalized.undotted + "_" + service.name + method.name
+}
+
+func packageServiceName(_ arguments: [Any?]) throws -> String {
+  if arguments.count != 2 {
+    throw TemplateSyntaxError("tag expects 2 arguments")
+  }
+  guard let protoFile = arguments[0] as? FileDescriptor
+    else {
+      throw TemplateSyntaxError("tag must be called with a " +
+        "FileDescriptor" +
+        " argument, received \(String(describing:arguments[0]))")
+  }
+  guard let service = arguments[1] as? ServiceDescriptor
+    else {
+      throw TemplateSyntaxError("tag must be called with a " +
+        "ServiceDescriptor" +
+        " argument, received \(String(describing:arguments[1]))")
+  }
+  return protoFile.package.capitalized.undotted + "_" + service.name
+}
+
+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))")
+	    }
+	}
+}

+ 42 - 178
Plugin/Sources/protoc-gen-swiftgrpc/main.swift

@@ -37,102 +37,8 @@ import PluginLibrary
 import Stencil
 import PathKit
 
-extension String {
-  var undotted : String {
-    return self.replacingOccurrences(of:".", with:"_")
-  }
-
-  var uppercasedFirst : String {
-    var out = self.characters
-    if let first = out.popFirst() {
-      return String(first).uppercased() + String(out)
-    } else {
-      return self
-    }
-  }
-}
-
-func protoMessageName(_ name :String?) -> String {
-  guard let name = name else {
-    return ""
-  }
-  let parts = name.undotted.components(separatedBy:"_")
-  var capitalizedParts : [String] = []
-  for part in parts {
-    if part != "" {
-      capitalizedParts.append(part.uppercasedFirst)
-    }
-  }
-  return capitalizedParts.joined(separator:"_")
-}
-
-func pathName(_ arguments: [Any?]) throws -> String {
-  if arguments.count != 3 {
-    throw TemplateSyntaxError("path expects 3 arguments")
-  }
-  guard let protoFile = arguments[0] as? Google_Protobuf_FileDescriptorProto
-    else {
-      throw TemplateSyntaxError("tag must be called with a " +
-        "Google_Protobuf_FileDescriptorProto" +
-        " argument, received \(String(describing:arguments[0]))")
-  }
-  guard let service = arguments[1] as? Google_Protobuf_ServiceDescriptorProto
-    else {
-      throw TemplateSyntaxError("tag must be called with a " +
-        "Google_Protobuf_ServiceDescriptorProto" +
-        " argument, received \(String(describing:arguments[1]))")
-  }
-  guard let method = arguments[2] as? Google_Protobuf_MethodDescriptorProto
-    else {
-      throw TemplateSyntaxError("tag must be called with a " +
-        "Google_Protobuf_MethodDescriptorProto" +
-        " argument, received \(String(describing:arguments[2]))")
-  }
-  return "/" + protoFile.package + "." + service.name + "/" + method.name
-}
-
-func packageServiceMethodName(_ arguments: [Any?]) throws -> String {
-  if arguments.count != 3 {
-    throw TemplateSyntaxError("tag expects 3 arguments")
-  }
-  guard let protoFile = arguments[0] as? Google_Protobuf_FileDescriptorProto
-    else {
-      throw TemplateSyntaxError("tag must be called with a " +
-        "Google_Protobuf_FileDescriptorProto" +
-        " argument, received \(String(describing:arguments[0]))")
-  }
-  guard let service = arguments[1] as? Google_Protobuf_ServiceDescriptorProto
-    else {
-      throw TemplateSyntaxError("tag must be called with a " +
-        "Google_Protobuf_ServiceDescriptorProto" +
-        " argument, received \(String(describing:arguments[1]))")
-  }
-  guard let method = arguments[2] as? Google_Protobuf_MethodDescriptorProto
-    else {
-      throw TemplateSyntaxError("tag must be called with a " +
-        "Google_Protobuf_MethodDescriptorProto" +
-        " argument, received \(String(describing:arguments[2]))")
-  }
-  return protoFile.package.capitalized.undotted + "_" + service.name + method.name
-}
-
-func packageServiceName(_ arguments: [Any?]) throws -> String {
-  if arguments.count != 2 {
-    throw TemplateSyntaxError("tag expects 2 arguments")
-  }
-  guard let protoFile = arguments[0] as? Google_Protobuf_FileDescriptorProto
-    else {
-      throw TemplateSyntaxError("tag must be called with a " +
-        "Google_Protobuf_FileDescriptorProto" +
-        " argument, received \(String(describing:arguments[0]))")
-  }
-  guard let service = arguments[1] as? Google_Protobuf_ServiceDescriptorProto
-    else {
-      throw TemplateSyntaxError("tag must be called with a " +
-        "Google_Protobuf_ServiceDescriptorProto" +
-        " argument, received \(String(describing:arguments[1]))")
-  }
-  return protoFile.package.capitalized.undotted + "_" + service.name
+func Log(_ message : String) {
+  FileHandle.standardError.write((message + "\n").data(using:.utf8)!)
 }
 
 // Code templates use "//-" prefixes to comment-out template operators
@@ -155,55 +61,11 @@ func stripMarkers(_ code:String) -> String {
   return outputLines.joined(separator:"\n")
 }
 
-func Log(_ message : String) {
-  FileHandle.standardError.write((message + "\n").data(using:.utf8)!)
-}
-
 func main() throws {
 
   // initialize template engine and add custom filters
-  let ext = Extension()
-  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? Google_Protobuf_MethodDescriptorProto {
-      return protoMessageName(value.inputType)
-    }
-    throw TemplateSyntaxError("message: invalid argument \(String(describing:value))")
-  }
-  ext.registerFilter("output") { (value: Any?) in
-    if let value = value as? Google_Protobuf_MethodDescriptorProto {
-      return protoMessageName(value.outputType)
-    }
-    throw TemplateSyntaxError("message: invalid argument \(String(describing:value))")
-  }
   let templateEnvironment = Environment(loader: InternalLoader(),
-                                        extensions:[ext])
+                                        extensions:[GRPCFilterExtension()])
 
   // initialize responses
   var response = Google_Protobuf_Compiler_CodeGeneratorResponse()
@@ -214,20 +76,22 @@ func main() throws {
   let request = try Google_Protobuf_Compiler_CodeGeneratorRequest(serializedData: rawRequest)
 
   var generatedFileNames = Set<String>()
-  
+
   // process each .proto file separately
   for protoFile in request.protoFile {
 
+    let file = FileDescriptor(proto:protoFile)
+
     // a package declaration is required
-	let package = protoFile.package
+    let package = file.package
     guard package != "" else {
-      print("ERROR: no package for \(protoFile.name)")
+      print("ERROR: no package for \(file.name)")
       continue
     }
 
     // log info about the service
-    log += "File \(protoFile.name)\n"
-    for service in protoFile.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"
@@ -236,39 +100,39 @@ func main() throws {
         log += "  client_streaming \(method.clientStreaming)\n"
         log += "  server_streaming \(method.serverStreaming)\n"
       }
-      log += " Options \(service.options)\n"
     }
-    Log(log)
-	
-    if protoFile.service.count > 0 {
-    // generate separate implementation files for client and server
-    let context : [String:Any] = ["protoFile": protoFile]
-	Log("\(context)")
-    do {
-      let clientFileName = package + ".client.pb.swift"
-      if !generatedFileNames.contains(clientFileName) {
-        generatedFileNames.insert(clientFileName)
-        let clientcode = try templateEnvironment.renderTemplate(name:"client.pb.swift",
-                                                                context: context)
-        var clientfile = Google_Protobuf_Compiler_CodeGeneratorResponse.File()
-        clientfile.name = clientFileName
-        clientfile.content = stripMarkers(clientcode)
-        response.file.append(clientfile)
-      }
 
-      let serverFileName = package + ".server.pb.swift"
-      if !generatedFileNames.contains(serverFileName) {
-        generatedFileNames.insert(serverFileName)
-        let servercode = try templateEnvironment.renderTemplate(name:"server.pb.swift",
-                                                                context: context)
-        var serverfile = Google_Protobuf_Compiler_CodeGeneratorResponse.File()
-        serverfile.name = serverFileName
-        serverfile.content = stripMarkers(servercode)
-        response.file.append(serverfile)
+    if file.service.count > 0 {
+
+      // generate separate implementation files for client and server
+      let context : [String:Any] = ["file": file]
+
+      do {
+        let clientFileName = package + ".client.pb.swift"
+        if !generatedFileNames.contains(clientFileName) {
+          generatedFileNames.insert(clientFileName)
+          let clientcode = try templateEnvironment.renderTemplate(name:"client.pb.swift",
+                                                                  context: context)
+          var clientfile = Google_Protobuf_Compiler_CodeGeneratorResponse.File()
+          clientfile.name = clientFileName
+          clientfile.content = stripMarkers(clientcode)
+          response.file.append(clientfile)
+        }
+
+        let serverFileName = package + ".server.pb.swift"
+        if !generatedFileNames.contains(serverFileName) {
+          generatedFileNames.insert(serverFileName)
+          let servercode = try templateEnvironment.renderTemplate(name:"server.pb.swift",
+                                                                  context: context)
+          var serverfile = Google_Protobuf_Compiler_CodeGeneratorResponse.File()
+          serverfile.name = serverFileName
+          serverfile.content = stripMarkers(servercode)
+          response.file.append(serverfile)
+        }
+      } catch (let error) {
+        Log("ERROR \(error)")
+        log += "ERROR: \(error)\n"
       }
-    } catch (let error) {
-      log += "ERROR: \(error)\n"
-    }
     }
   }
 
@@ -286,7 +150,7 @@ func main() throws {
 }
 
 do {
-	try main()	
+  try main()
 } catch (let error) {
-	Log("ERROR: \(error)")	
+  Log("ERROR: \(error)")	
 }

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

@@ -0,0 +1,81 @@
+/*
+ *
+ * Copyright 2017, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+import Foundation
+import SwiftProtobuf
+import PluginLibrary
+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
+  }
+}
+

Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
Plugin/Sources/protoc-gen-swiftgrpc/templates.swift


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

@@ -1,22 +1,22 @@
 /// {{ method.name }} (Bidirectional Streaming)
-public class {{ .|call:protoFile,service,method }} {
+public class {{ .|call:file,service,method }} {
   private var call : Call
 
   /// Create a call.
   fileprivate init(_ channel: Channel) {
-    self.call = channel.makeCall("{{ .|path:protoFile,service,method }}")
+    self.call = channel.makeCall("{{ .|path:file,service,method }}")
   }
 
   /// Call this to start a call. Nonblocking.
   fileprivate func start(metadata:Metadata, completion:@escaping (CallResult)->())
-    throws -> {{ .|call:protoFile,service,method }} {
+    throws -> {{ .|call:file,service,method }} {
       try self.call.start(.bidiStreaming, metadata:metadata, completion:completion)
       return self
   }
 
   /// Call this to wait for a result. Blocking.
   public func receive() throws -> {{ method|output }} {
-    var returnError : {{ .|clienterror:protoFile,service }}?
+    var returnError : {{ .|clienterror:file,service }}?
     var returnMessage : {{ method|output }}!
     let sem = DispatchSemaphore(value: 0)
     do {
@@ -34,17 +34,17 @@ public class {{ .|call:protoFile,service,method }} {
   }
 
   /// Call this to wait for a result. Nonblocking.
-  public func receive(completion:@escaping ({{ method|output }}?, {{ .|clienterror:protoFile,service }}?)->()) throws {
+  public func receive(completion:@escaping ({{ method|output }}?, {{ .|clienterror:file,service }}?)->()) throws {
     do {
       try call.receiveMessage() {(data) in
         if let data = data {
-          if let returnMessage = try? {{ method|output }}(protobuf:data) {
+          if let returnMessage = try? {{ method|output }}(serializedData:data) {
             completion(returnMessage, nil)
           } else {
-            completion(nil, {{ .|clienterror:protoFile,service }}.invalidMessageReceived)
+            completion(nil, {{ .|clienterror:file,service }}.invalidMessageReceived)
           }
         } else {
-          completion(nil, {{ .|clienterror:protoFile,service }}.endOfStream)
+          completion(nil, {{ .|clienterror:file,service }}.endOfStream)
         }
       }
     }
@@ -52,7 +52,7 @@ public class {{ .|call:protoFile,service,method }} {
 
   /// Call this to send each message in the request stream.
   public func send(_ message:Echo_EchoRequest, errorHandler:@escaping (Error)->()) throws {
-    let messageData = try message.serializeProtobuf()
+    let messageData = try message.serializedData()
     try call.sendMessage(data:messageData, errorHandler:errorHandler)
   }
 

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

@@ -1,28 +1,28 @@
 /// {{ method.name }} (Client Streaming)
-public class {{ .|call:protoFile,service,method }} {
+public class {{ .|call:file,service,method }} {
   private var call : Call
 
   /// Create a call.
   fileprivate init(_ channel: Channel) {
-    self.call = channel.makeCall("{{ .|path:protoFile,service,method }}")
+    self.call = channel.makeCall("{{ .|path:file,service,method }}")
   }
 
   /// Call this to start a call. Nonblocking.
   fileprivate func start(metadata:Metadata, completion:@escaping (CallResult)->())
-    throws -> {{ .|call:protoFile,service,method }} {
+    throws -> {{ .|call:file,service,method }} {
       try self.call.start(.clientStreaming, metadata:metadata, completion:completion)
       return self
   }
 
   /// Call this to send each message in the request stream. Nonblocking.
   public func send(_ message:Echo_EchoRequest, errorHandler:@escaping (Error)->()) throws {
-    let messageData = try message.serializeProtobuf()
+    let messageData = try message.serializedData()
     try call.sendMessage(data:messageData, errorHandler:errorHandler)
   }
 
   /// Call this to close the connection and wait for a response. Blocking.
   public func closeAndReceive() throws -> {{ method|output }} {
-    var returnError : {{ .|clienterror:protoFile,service }}?
+    var returnError : {{ .|clienterror:file,service }}?
     var returnResponse : {{ method|output }}!
     let sem = DispatchSemaphore(value: 0)
     do {
@@ -42,15 +42,15 @@ public class {{ .|call:protoFile,service,method }} {
   }
 
   /// Call this to close the connection and wait for a response. Nonblocking.
-  public func closeAndReceive(completion:@escaping ({{ method|output }}?, {{ .|clienterror:protoFile,service }}?)->())
+  public func closeAndReceive(completion:@escaping ({{ method|output }}?, {{ .|clienterror:file,service }}?)->())
     throws {
       do {
         try call.receiveMessage() {(responseData) in
           if let responseData = responseData,
-            let response = try? {{ method|output }}(protobuf:responseData) {
+            let response = try? {{ method|output }}(serializedData:responseData) {
             completion(response, nil)
           } else {
-            completion(nil, {{ .|clienterror:protoFile,service }}.invalidMessageReceived)
+            completion(nil, {{ .|clienterror:file,service }}.invalidMessageReceived)
           }
         }
         try call.close(completion:{})

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

@@ -1,18 +1,18 @@
 /// {{ method.name }} (Server Streaming)
-public class {{ .|call:protoFile,service,method }} {
+public class {{ .|call:file,service,method }} {
   private var call : Call
 
   /// Create a call.
   fileprivate init(_ channel: Channel) {
-    self.call = channel.makeCall("{{ .|path:protoFile,service,method }}")
+    self.call = channel.makeCall("{{ .|path:file,service,method }}")
   }
 
   /// Call this once with the message to send. Nonblocking.
   fileprivate func start(request: {{ method|input }},
                          metadata: Metadata,
                          completion: @escaping (CallResult) -> ())
-    throws -> {{ .|call:protoFile,service,method }} {
-      let requestData = try request.serializeProtobuf()
+    throws -> {{ .|call:file,service,method }} {
+      let requestData = try request.serializedData()
       try call.start(.serverStreaming,
                      metadata:metadata,
                      message:requestData,
@@ -22,7 +22,7 @@ public class {{ .|call:protoFile,service,method }} {
 
   /// Call this to wait for a result. Blocking.
   public func receive() throws -> {{ method|output }} {
-    var returnError : {{ .|clienterror:protoFile,service }}?
+    var returnError : {{ .|clienterror:file,service }}?
     var returnResponse : {{ method|output }}!
     let sem = DispatchSemaphore(value: 0)
     do {
@@ -40,17 +40,17 @@ public class {{ .|call:protoFile,service,method }} {
   }
 
   /// Call this to wait for a result. Nonblocking.
-  public func receive(completion:@escaping ({{ method|output }}?, {{ .|clienterror:protoFile,service }}?)->()) throws {
+  public func receive(completion:@escaping ({{ method|output }}?, {{ .|clienterror:file,service }}?)->()) throws {
     do {
       try call.receiveMessage() {(responseData) in
         if let responseData = responseData {
-          if let response = try? {{ method|output }}(protobuf:responseData) {
+          if let response = try? {{ method|output }}(serializedData:responseData) {
             completion(response, nil)
           } else {
-            completion(nil, {{ .|clienterror:protoFile,service }}.invalidMessageReceived)
+            completion(nil, {{ .|clienterror:file,service }}.invalidMessageReceived)
           }
         } else {
-          completion(nil, {{ .|clienterror:protoFile,service }}.endOfStream)
+          completion(nil, {{ .|clienterror:file,service }}.endOfStream)
         }
       }
     }

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

@@ -1,10 +1,10 @@
 /// {{ method.name }} (Unary)
-public class {{ .|call:protoFile,service,method }} {
+public class {{ .|call:file,service,method }} {
   private var call : Call
 
   /// Create a call.
   fileprivate init(_ channel: Channel) {
-    self.call = channel.makeCall("{{ .|path:protoFile,service,method }}")
+    self.call = channel.makeCall("{{ .|path:file,service,method }}")
   }
 
   /// Run the call. Blocks until the reply is received.
@@ -22,7 +22,7 @@ public class {{ .|call:protoFile,service,method }} {
     if let returnResponse = returnResponse {
       return returnResponse
     } else {
-      throw {{ .|clienterror:protoFile,service }}.error(c: returnCallResult)
+      throw {{ .|clienterror:file,service }}.error(c: returnCallResult)
     }
   }
 
@@ -30,15 +30,15 @@ public class {{ .|call:protoFile,service,method }} {
   fileprivate func start(request: {{ method|input }},
                          metadata: Metadata,
                          completion: @escaping ({{ method|output }}?, CallResult)->())
-    throws -> {{ .|call:protoFile,service,method }} {
+    throws -> {{ .|call:file,service,method }} {
 
-      let requestData = try request.serializeProtobuf()
+      let requestData = try request.serializedData()
       try call.start(.unary,
                      metadata:metadata,
                      message:requestData)
       {(callResult) in
         if let responseData = callResult.resultData,
-          let response = try? {{ method|output }}(protobuf:responseData) {
+          let response = try? {{ method|output }}(serializedData:responseData) {
           completion(response, callResult)
         } else {
           completion(nil, callResult)

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

@@ -2,7 +2,7 @@
  * DO NOT EDIT.
  *
  * Generated by the protocol buffer compiler.
- * Source: {{ protoFile.name }}
+ * Source: {{ file.name }}
  *
  */
 
@@ -42,10 +42,10 @@
 import Foundation
 import Dispatch
 import gRPC
-//-{% for service in protoFile.service %}
+//-{% for service in file.service %}
 
 /// Type for errors thrown from generated client code.
-public enum {{ .|clienterror:protoFile,service }} : Error {
+public enum {{ .|clienterror:file,service }} : Error {
   case endOfStream
   case invalidMessageReceived
   case error(c: CallResult)
@@ -66,7 +66,7 @@ public enum {{ .|clienterror:protoFile,service }} : Error {
 //-{% endif %}
 //-{% endfor %}
 /// Call methods of this class to make API calls.
-public class {{ .|serviceclass:protoFile,service }} {
+public class {{ .|serviceclass:file,service }} {
   private var channel: Channel
 
   /// This metadata will be sent with all requests.
@@ -104,14 +104,14 @@ public class {{ .|serviceclass:protoFile,service }} {
   public func {{ method.name|lowercase }}(_ request: {{ method|input }})
     throws
     -> {{ method|output }} {
-      return try {{ .|call:protoFile,service,method }}(channel).run(request:request, metadata:metadata)
+      return try {{ .|call:file,service,method }}(channel).run(request:request, metadata:metadata)
   }
   /// Asynchronous. Unary.
   public func {{ method.name|lowercase }}(_ request: {{ method|input }},
                   completion: @escaping ({{ method|output }}?, CallResult)->())
     throws
-    -> {{ .|call:protoFile,service,method }} {
-      return try {{ .|call:protoFile,service,method }}(channel).start(request:request,
+    -> {{ .|call:file,service,method }} {
+      return try {{ .|call:file,service,method }}(channel).start(request:request,
                                                  metadata:metadata,
                                                  completion:completion)
   }
@@ -122,8 +122,8 @@ public class {{ .|serviceclass:protoFile,service }} {
   /// Use methods on the returned object to get streamed responses.
   public func {{ method.name|lowercase }}(_ request: {{ method|input }}, completion: @escaping (CallResult)->())
     throws
-    -> {{ .|call:protoFile,service,method }} {
-      return try {{ .|call:protoFile,service,method }}(channel).start(request:request, metadata:metadata, completion:completion)
+    -> {{ .|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 %}
@@ -132,8 +132,8 @@ public class {{ .|serviceclass:protoFile,service }} {
   /// to close the connection and wait for a final response.
   public func {{ method.name|lowercase }}(completion: @escaping (CallResult)->())
     throws
-    -> {{ .|call:protoFile,service,method }} {
-      return try {{ .|call:protoFile,service,method }}(channel).start(metadata:metadata, completion:completion)
+    -> {{ .|call:file,service,method }} {
+      return try {{ .|call:file,service,method }}(channel).start(metadata:metadata, completion:completion)
   }
   //-{% endif %}
   //-{% if method.clientStreaming and method.serverStreaming %}
@@ -142,8 +142,8 @@ public class {{ .|serviceclass:protoFile,service }} {
   /// to wait for replies, and to close the connection.
   public func {{ method.name|lowercase }}(completion: @escaping (CallResult)->())
     throws
-    -> {{ .|call:protoFile,service,method }} {
-      return try {{ .|call:protoFile,service,method }}(channel).start(metadata:metadata, completion:completion)
+    -> {{ .|call:file,service,method }} {
+      return try {{ .|call:file,service,method }}(channel).start(metadata:metadata, completion:completion)
   }
   //-{% endif %}
   //-{% endfor %}

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

@@ -1,9 +1,9 @@
 // {{ method.name }} (Bidirectional Streaming)
-public class {{ .|session:protoFile,service,method }} : {{ .|service:protoFile,service }}Session {
-  private var provider : {{ .|provider:protoFile,service }}
+public class {{ .|session:file,service,method }} : {{ .|service:file,service }}Session {
+  private var provider : {{ .|provider:file,service }}
 
   /// Create a session.
-  fileprivate init(handler:gRPC.Handler, provider: {{ .|provider:protoFile,service }}) {
+  fileprivate init(handler:gRPC.Handler, provider: {{ .|provider:file,service }}) {
     self.provider = provider
     super.init(handler:handler)
   }
@@ -15,7 +15,7 @@ public class {{ .|session:protoFile,service,method }} : {{ .|service:protoFile,s
     try self.handler.receiveMessage() {(requestData) in
       if let requestData = requestData {
         do {
-          requestMessage = try {{ method|input }}(protobuf:requestData)
+          requestMessage = try {{ method|input }}(serializedData:requestData)
         } catch (let error) {
           print("error \(error)")
         }
@@ -26,13 +26,13 @@ public class {{ .|session:protoFile,service,method }} : {{ .|service:protoFile,s
     if let requestMessage = requestMessage {
       return requestMessage
     } else {
-      throw {{ .|servererror:protoFile,service }}.endOfStream
+      throw {{ .|servererror:file,service }}.endOfStream
     }
   }
 
   /// Send a message. Nonblocking.
   public func send(_ response: {{ method|output }}) throws {
-    try handler.sendResponse(message:response.serializeProtobuf()) {}
+    try handler.sendResponse(message:response.serializedData()) {}
   }
 
   /// Close a connection. Blocks until the connection is closed.

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

@@ -1,9 +1,9 @@
 // {{ method.name }} (Client Streaming)
-public class {{ .|session:protoFile,service,method }} : {{ .|service:protoFile,service }}Session {
-  private var provider : {{ .|provider:protoFile,service }}
+public class {{ .|session:file,service,method }} : {{ .|service:file,service }}Session {
+  private var provider : {{ .|provider:file,service }}
 
   /// Create a session.
-  fileprivate init(handler:gRPC.Handler, provider: {{ .|provider:protoFile,service }}) {
+  fileprivate init(handler:gRPC.Handler, provider: {{ .|provider:file,service }}) {
     self.provider = provider
     super.init(handler:handler)
   }
@@ -14,20 +14,20 @@ public class {{ .|session:protoFile,service,method }} : {{ .|service:protoFile,s
     var requestMessage : {{ method|input }}?
     try self.handler.receiveMessage() {(requestData) in
       if let requestData = requestData {
-        requestMessage = try? {{ method|input }}(protobuf:requestData)
+        requestMessage = try? {{ method|input }}(serializedData:requestData)
       }
       sem.signal()
     }
     _ = sem.wait(timeout: DispatchTime.distantFuture)
     if requestMessage == nil {
-      throw {{ .|servererror:protoFile,service }}.endOfStream
+      throw {{ .|servererror:file,service }}.endOfStream
     }
     return requestMessage!
   }
 
   /// Send a response and close the connection.
   public func sendAndClose(_ response: {{ method|output }}) throws {
-    try self.handler.sendResponse(message:response.serializeProtobuf(),
+    try self.handler.sendResponse(message:response.serializedData(),
                                   statusCode:self.statusCode,
                                   statusMessage:self.statusMessage,
                                   trailingMetadata:self.trailingMetadata)

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

@@ -1,16 +1,16 @@
 // {{ method.name }} (Server Streaming)
-public class {{ .|session:protoFile,service,method }} : {{ .|service:protoFile,service }}Session {
-  private var provider : {{ .|provider:protoFile,service }}
+public class {{ .|session:file,service,method }} : {{ .|service:file,service }}Session {
+  private var provider : {{ .|provider:file,service }}
 
   /// Create a session.
-  fileprivate init(handler:gRPC.Handler, provider: {{ .|provider:protoFile,service }}) {
+  fileprivate init(handler:gRPC.Handler, provider: {{ .|provider:file,service }}) {
     self.provider = provider
     super.init(handler:handler)
   }
 
   /// Send a message. Nonblocking.
   public func send(_ response: {{ method|output }}) throws {
-    try handler.sendResponse(message:response.serializeProtobuf()) {}
+    try handler.sendResponse(message:response.serializedData()) {}
   }
 
   /// Run the session. Internal.
@@ -18,7 +18,7 @@ public class {{ .|session:protoFile,service,method }} : {{ .|service:protoFile,s
     try self.handler.receiveMessage(initialMetadata:initialMetadata) {(requestData) in
       if let requestData = requestData {
         do {
-          let requestMessage = try {{ method|input }}(protobuf:requestData)
+          let requestMessage = try {{ method|input }}(serializedData:requestData)
           // to keep providers from blocking the server thread,
           // we dispatch them to another queue.
           queue.async {

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

@@ -1,9 +1,9 @@
 // {{ method.name }} (Unary)
-public class {{ .|session:protoFile,service,method }} : {{ .|service:protoFile,service }}Session {
-  private var provider : {{ .|provider:protoFile,service }}
+public class {{ .|session:file,service,method }} : {{ .|service:file,service }}Session {
+  private var provider : {{ .|provider:file,service }}
 
   /// Create a session.
-  fileprivate init(handler:gRPC.Handler, provider: {{ .|provider:protoFile,service }}) {
+  fileprivate init(handler:gRPC.Handler, provider: {{ .|provider:file,service }}) {
     self.provider = provider
     super.init(handler:handler)
   }
@@ -12,9 +12,9 @@ public class {{ .|session:protoFile,service,method }} : {{ .|service:protoFile,s
   fileprivate func run(queue:DispatchQueue) throws {
     try handler.receiveMessage(initialMetadata:initialMetadata) {(requestData) in
       if let requestData = requestData {
-        let requestMessage = try {{ method|input }}(protobuf:requestData)
+        let requestMessage = try {{ method|input }}(serializedData:requestData)
         let replyMessage = try self.provider.{{ method.name|lowercase }}(request:requestMessage, session: self)
-        try self.handler.sendResponse(message:replyMessage.serializeProtobuf(),
+        try self.handler.sendResponse(message:replyMessage.serializedData(),
                                       statusCode:self.statusCode,
                                       statusMessage:self.statusMessage,
                                       trailingMetadata:self.trailingMetadata)

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

@@ -2,7 +2,7 @@
  * DO NOT EDIT.
  *
  * Generated by the protocol buffer compiler.
- * Source: {{ protoFile.name }}
+ * Source: {{ file.name }}
  *
  */
 
@@ -42,33 +42,33 @@
 import Foundation
 import Dispatch
 import gRPC
-//-{% for service in protoFile.service %}
+//-{% for service in file.service %}
 
 /// Type for errors thrown from generated server code.
-public enum {{ .|servererror:protoFile,service }} : Error {
+public enum {{ .|servererror:file,service }} : Error {
   case endOfStream
 }
 
 /// To build a server, implement a class that conforms to this protocol.
-public protocol {{ .|provider:protoFile,service }} {
+public 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:protoFile,service,method }}) throws -> {{ method|output }}
+  func {{ method.name|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:protoFile,service,method }}) throws
+  func {{ method.name|lowercase }}(request : {{ method|input }}, session : {{ .|session:file,service,method }}) throws
   //-{% endif %}
   //-{% if method.clientStreaming and not method.serverStreaming %}
-  func {{ method.name|lowercase }}(session : {{ .|session:protoFile,service,method }}) throws
+  func {{ method.name|lowercase }}(session : {{ .|session:file,service,method }}) throws
   //-{% endif %}
   //-{% if method.clientStreaming and method.serverStreaming %}
-  func {{ method.name|lowercase }}(session : {{ .|session:protoFile,service,method }}) throws
+  func {{ method.name|lowercase }}(session : {{ .|session:file,service,method }}) throws
   //-{% endif %}
   //-{% endfor %}
 }
 
 /// Common properties available in each service session.
-public class {{ .|service:protoFile,service }}Session {
+public class {{ .|service:file,service }}Session {
   fileprivate var handler : gRPC.Handler
   public var requestMetadata : Metadata { return handler.requestMetadata }
 
@@ -98,14 +98,14 @@ public class {{ .|service:protoFile,service }}Session {
 //-{% endfor %}
 
 /// Main server for generated service
-public class {{ .|server:protoFile,service }} {
+public class {{ .|server:file,service }} {
   private var address: String
   private var server: gRPC.Server
-  private var provider: {{ .|provider:protoFile,service }}?
+  private var provider: {{ .|provider:file,service }}?
 
   /// Create a server that accepts insecure connections.
   public init(address:String,
-              provider:{{ .|provider:protoFile,service }}) {
+              provider:{{ .|provider:file,service }}) {
     gRPC.initialize()
     self.address = address
     self.provider = provider
@@ -116,7 +116,7 @@ public class {{ .|server:protoFile,service }} {
   public init?(address:String,
                certificateURL:URL,
                keyURL:URL,
-               provider:{{ .|provider:protoFile,service }}) {
+               provider:{{ .|provider:file,service }}) {
     gRPC.initialize()
     self.address = address
     self.provider = provider
@@ -143,8 +143,8 @@ public class {{ .|server:protoFile,service }} {
       do {
         switch handler.method {
         //-{% for method in service.method %}
-        case "{{ .|path:protoFile,service,method }}":
-          try {{ .|session:protoFile,service,method }}(handler:handler, provider:provider).run(queue:queue)
+        case "{{ .|path:file,service,method }}":
+          try {{ .|session:file,service,method }}(handler:handler, provider:provider).run(queue:queue)
         //-{% endfor %}
         default:
           break // handle unknown requests

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.