Browse Source

Progress toward full server code generation.

Tim Burks 9 years ago
parent
commit
7ed9c08c22

+ 1 - 1
Examples/Echo/Swift/Echo/echo.server.pb.swift

@@ -48,8 +48,8 @@ public enum Echo_EchoServerError : Error {
 
 
 public protocol Echo_EchoProvider {
 public protocol Echo_EchoProvider {
   func get(request : Echo_EchoRequest) throws -> Echo_EchoResponse
   func get(request : Echo_EchoRequest) throws -> Echo_EchoResponse
-  func collect(session : Echo_EchoCollectSession) throws
   func expand(request : Echo_EchoRequest, session : Echo_EchoExpandSession) throws
   func expand(request : Echo_EchoRequest, session : Echo_EchoExpandSession) throws
+  func collect(session : Echo_EchoCollectSession) throws
   func update(session : Echo_EchoUpdateSession) throws
   func update(session : Echo_EchoUpdateSession) throws
 }
 }
 
 

+ 46 - 3
Plugin/Sources/main.swift

@@ -46,8 +46,6 @@ func stripMarkers(_ code:String) -> String {
   return outputLines.joined(separator:"\n")
   return outputLines.joined(separator:"\n")
 }
 }
 
 
-
-
 func main() throws {
 func main() throws {
 
 
   // initialize template engine
   // initialize template engine
@@ -104,6 +102,31 @@ func main() throws {
     return "/" + protoFile.package! + "." + service.name! + "/" + method.name!
     return "/" + protoFile.package! + "." + service.name! + "/" + method.name!
   }
   }
 
 
+  ext.registerFilter("sessionname") { (value: Any?, arguments: [Any?]) in
+    if arguments.count != 3 {
+      throw TemplateSyntaxError("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 \(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 \(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 \(arguments[2])")
+    }
+    return protoFile.package!.capitalized + "_" + service.name! + method.name! + "Session"
+  }
+
   ext.registerFilter("errorname") { (value: Any?, arguments: [Any?]) in
   ext.registerFilter("errorname") { (value: Any?, arguments: [Any?]) in
     if arguments.count != 2 {
     if arguments.count != 2 {
       throw TemplateSyntaxError("expects 2 arguments")
       throw TemplateSyntaxError("expects 2 arguments")
@@ -137,6 +160,26 @@ func main() throws {
     throw TemplateSyntaxError("message: invalid argument \(value)")
     throw TemplateSyntaxError("message: invalid argument \(value)")
   }
   }
 
 
+  ext.registerFilter("servererrorname") { (value: Any?, arguments: [Any?]) in
+    if arguments.count != 2 {
+      throw TemplateSyntaxError("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 \(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 \(arguments[1])")
+    }
+    return protoFile.package!.capitalized + "_" + service.name! + "ServerError"
+  }
+
+
   let templateEnvironment = Environment(loader: fileSystemLoader,
   let templateEnvironment = Environment(loader: fileSystemLoader,
                                         extensions:[ext])
                                         extensions:[ext])
 
 
@@ -186,7 +229,7 @@ func main() throws {
                                                               context: context)
                                                               context: context)
       var serverfile = Google_Protobuf_Compiler_CodeGeneratorResponse.File()
       var serverfile = Google_Protobuf_Compiler_CodeGeneratorResponse.File()
       serverfile.name = package + ".server.pb.swift"
       serverfile.name = package + ".server.pb.swift"
-      serverfile.content = servercode
+      serverfile.content = stripMarkers(servercode)
       response.file.append(serverfile)
       response.file.append(serverfile)
     } catch (let error) {
     } catch (let error) {
       log += "ERROR: \(error)\n"
       log += "ERROR: \(error)\n"

+ 60 - 0
Plugin/templates/server-session-bidistreaming.swift

@@ -0,0 +1,60 @@
+// fully streaming
+public class Echo_EchoUpdateSession {
+  var handler : gRPC.Handler
+  var provider : Echo_EchoProvider
+
+  fileprivate init(handler:gRPC.Handler, provider: Echo_EchoProvider) {
+    self.handler = handler
+    self.provider = provider
+  }
+
+  public func Receive() throws -> Echo_EchoRequest {
+    let done = NSCondition()
+    var requestMessage : Echo_EchoRequest?
+    try self.handler.receiveMessage() {(requestData) in
+      if let requestData = requestData {
+        requestMessage = try! Echo_EchoRequest(protobuf:requestData)
+      }
+      done.lock()
+      done.signal()
+      done.unlock()
+    }
+    done.lock()
+    done.wait()
+    done.unlock()
+    if requestMessage == nil {
+      throw Echo_EchoServerError.endOfStream
+    }
+    return requestMessage!
+  }
+
+  public func Send(_ response: Echo_EchoResponse) throws {
+    try handler.sendResponse(message:response.serializeProtobuf()) {}
+  }
+
+  public func Close() {
+    let done = NSCondition()
+    try! self.handler.sendStatus(statusCode: 0,
+                                 statusMessage: "OK",
+                                 trailingMetadata: Metadata()) {
+                                  done.lock()
+                                  done.signal()
+                                  done.unlock()
+    }
+    done.lock()
+    done.wait()
+    done.unlock()
+  }
+
+  fileprivate func run(queue:DispatchQueue) {
+    do {
+      try self.handler.sendMetadata(initialMetadata:Metadata()) {
+        queue.async {
+          try! self.provider.update(session:self)
+        }
+      }
+    } catch (let callError) {
+      print("grpc error: \(callError)")
+    }
+  }
+}

+ 50 - 0
Plugin/templates/server-session-clientstreaming.swift

@@ -0,0 +1,50 @@
+// client streaming
+public class Echo_EchoCollectSession {
+  var handler : gRPC.Handler
+  var provider : Echo_EchoProvider
+
+  fileprivate init(handler:gRPC.Handler, provider: Echo_EchoProvider) {
+    self.handler = handler
+    self.provider = provider
+  }
+
+  public func Receive() throws -> Echo_EchoRequest {
+    let done = NSCondition()
+    var requestMessage : Echo_EchoRequest?
+    try self.handler.receiveMessage() {(requestData) in
+      if let requestData = requestData {
+        requestMessage = try! Echo_EchoRequest(protobuf:requestData)
+      }
+      done.lock()
+      done.signal()
+      done.unlock()
+    }
+    done.lock()
+    done.wait()
+    done.unlock()
+    if requestMessage == nil {
+      throw Echo_EchoServerError.endOfStream
+    }
+    return requestMessage!
+  }
+
+  public func SendAndClose(_ response: Echo_EchoResponse) throws {
+    try! self.handler.sendResponse(message:response.serializeProtobuf(),
+                                   statusCode: 0,
+                                   statusMessage: "OK",
+                                   trailingMetadata: Metadata())
+  }
+
+  fileprivate func run(queue:DispatchQueue) {
+    do {
+      print("EchoCollectSession run")
+      try self.handler.sendMetadata(initialMetadata:Metadata()) {
+        queue.async {
+          try! self.provider.collect(session:self)
+        }
+      }
+    } catch (let callError) {
+      print("grpc error: \(callError)")
+    }
+  }
+}

+ 35 - 0
Plugin/templates/server-session-serverstreaming.swift

@@ -0,0 +1,35 @@
+// server streaming
+public class Echo_EchoExpandSession {
+  var handler : gRPC.Handler
+  var provider : Echo_EchoProvider
+
+  fileprivate init(handler:gRPC.Handler, provider: Echo_EchoProvider) {
+    self.handler = handler
+    self.provider = provider
+  }
+
+  public func Send(_ response: Echo_EchoResponse) throws {
+    try! handler.sendResponse(message:response.serializeProtobuf()) {}
+  }
+
+  fileprivate func run(queue:DispatchQueue) {
+    do {
+      try self.handler.receiveMessage(initialMetadata:Metadata()) {(requestData) in
+        if let requestData = requestData {
+          let requestMessage = try! Echo_EchoRequest(protobuf:requestData)
+          // to keep providers from blocking the server thread,
+          // we dispatch them to another queue.
+          queue.async {
+            try! self.provider.expand(request:requestMessage, session: self)
+            try! self.handler.sendStatus(statusCode:0,
+                                         statusMessage:"OK",
+                                         trailingMetadata:Metadata(),
+                                         completion:{})
+          }
+        }
+      }
+    } catch (let callError) {
+      print("grpc error: \(callError)")
+    }
+  }
+}

+ 28 - 0
Plugin/templates/server-session-unary.swift

@@ -0,0 +1,28 @@
+// unary
+public class Echo_EchoGetSession {
+  var handler : gRPC.Handler
+  var provider : Echo_EchoProvider
+
+  fileprivate init(handler:gRPC.Handler, provider: Echo_EchoProvider) {
+    self.handler = handler
+    self.provider = provider
+  }
+
+  fileprivate func run(queue:DispatchQueue) {
+    do {
+      try handler.receiveMessage(initialMetadata:Metadata()) {(requestData) in
+        if let requestData = requestData {
+          let requestMessage = try! Echo_EchoRequest(protobuf:requestData)
+          let replyMessage = try! self.provider.get(request:requestMessage)
+          try self.handler.sendResponse(message:replyMessage.serializeProtobuf(),
+                                        statusCode: 0,
+                                        statusMessage: "OK",
+                                        trailingMetadata:Metadata())
+
+        }
+      }
+    } catch (let callError) {
+      print("grpc error: \(callError)")
+    }
+  }
+}

+ 35 - 190
Plugin/templates/server.pb.swift

@@ -42,193 +42,42 @@
 import Foundation
 import Foundation
 import gRPC
 import gRPC
 
 
-public enum Echo_EchoServerError : Error {
+//-{% for service in protoFile.service %}
+public enum {{ .|servererrorname:protoFile,service }} : Error {
   case endOfStream
   case endOfStream
 }
 }
 
 
 public protocol Echo_EchoProvider {
 public protocol Echo_EchoProvider {
-  func get(request : Echo_EchoRequest) throws -> Echo_EchoResponse
-  func collect(session : Echo_EchoCollectSession) throws
-  func expand(request : Echo_EchoRequest, session : Echo_EchoExpandSession) throws
-  func update(session : Echo_EchoUpdateSession) throws
+  //-{% for method in service.method %}
+  //-{% if not method.clientStreaming and not method.serverStreaming %}
+  func {{ method.name|lowercase }}(request : {{ method|inputType }}) throws -> {{ method|outputType }}
+  //-{% endif %}
+  //-{% if not method.clientStreaming and method.serverStreaming %}
+  func {{ method.name|lowercase }}(request : {{ method|inputType }}, session : {{ .|sessionname:protoFile,service,method }}) throws
+  //-{% endif %}
+  //-{% if method.clientStreaming and not method.serverStreaming %}
+  func {{ method.name|lowercase }}(session : {{ .|sessionname:protoFile,service,method }}) throws
+  //-{% endif %}
+  //-{% if method.clientStreaming and method.serverStreaming %}
+  func {{ method.name|lowercase }}(session : {{ .|sessionname:protoFile,service,method }}) throws
+  //-{% endif %}
+  //-{% endfor %}
 }
 }
 
 
-// unary
-public class Echo_EchoGetSession {
-  var handler : gRPC.Handler
-  var provider : Echo_EchoProvider
-
-  fileprivate init(handler:gRPC.Handler, provider: Echo_EchoProvider) {
-    self.handler = handler
-    self.provider = provider
-  }
-
-  fileprivate func run(queue:DispatchQueue) {
-    do {
-      try handler.receiveMessage(initialMetadata:Metadata()) {(requestData) in
-        if let requestData = requestData {
-          let requestMessage = try! Echo_EchoRequest(protobuf:requestData)
-          let replyMessage = try! self.provider.get(request:requestMessage)
-          try self.handler.sendResponse(message:replyMessage.serializeProtobuf(),
-                                        statusCode: 0,
-                                        statusMessage: "OK",
-                                        trailingMetadata:Metadata())
-
-        }
-      }
-    } catch (let callError) {
-      print("grpc error: \(callError)")
-    }
-  }
-}
-
-// server streaming
-public class Echo_EchoExpandSession {
-  var handler : gRPC.Handler
-  var provider : Echo_EchoProvider
-
-  fileprivate init(handler:gRPC.Handler, provider: Echo_EchoProvider) {
-    self.handler = handler
-    self.provider = provider
-  }
-
-  public func Send(_ response: Echo_EchoResponse) throws {
-    try! handler.sendResponse(message:response.serializeProtobuf()) {}
-  }
-
-  fileprivate func run(queue:DispatchQueue) {
-    do {
-      try self.handler.receiveMessage(initialMetadata:Metadata()) {(requestData) in
-        if let requestData = requestData {
-          let requestMessage = try! Echo_EchoRequest(protobuf:requestData)
-          // to keep providers from blocking the server thread,
-          // we dispatch them to another queue.
-          queue.async {
-            try! self.provider.expand(request:requestMessage, session: self)
-            try! self.handler.sendStatus(statusCode:0,
-                                         statusMessage:"OK",
-                                         trailingMetadata:Metadata(),
-                                         completion:{})
-          }
-        }
-      }
-    } catch (let callError) {
-      print("grpc error: \(callError)")
-    }
-  }
-}
-
-// client streaming
-public class Echo_EchoCollectSession {
-  var handler : gRPC.Handler
-  var provider : Echo_EchoProvider
-
-  fileprivate init(handler:gRPC.Handler, provider: Echo_EchoProvider) {
-    self.handler = handler
-    self.provider = provider
-  }
-
-  public func Receive() throws -> Echo_EchoRequest {
-    let done = NSCondition()
-    var requestMessage : Echo_EchoRequest?
-    try self.handler.receiveMessage() {(requestData) in
-      if let requestData = requestData {
-        requestMessage = try! Echo_EchoRequest(protobuf:requestData)
-      }
-      done.lock()
-      done.signal()
-      done.unlock()
-    }
-    done.lock()
-    done.wait()
-    done.unlock()
-    if requestMessage == nil {
-      throw Echo_EchoServerError.endOfStream
-    }
-    return requestMessage!
-  }
-
-  public func SendAndClose(_ response: Echo_EchoResponse) throws {
-    try! self.handler.sendResponse(message:response.serializeProtobuf(),
-                                   statusCode: 0,
-                                   statusMessage: "OK",
-                                   trailingMetadata: Metadata())
-  }
-
-  fileprivate func run(queue:DispatchQueue) {
-    do {
-      print("EchoCollectSession run")
-      try self.handler.sendMetadata(initialMetadata:Metadata()) {
-        queue.async {
-          try! self.provider.collect(session:self)
-        }
-      }
-    } catch (let callError) {
-      print("grpc error: \(callError)")
-    }
-  }
-}
-
-// fully streaming
-public class Echo_EchoUpdateSession {
-  var handler : gRPC.Handler
-  var provider : Echo_EchoProvider
-
-  fileprivate init(handler:gRPC.Handler, provider: Echo_EchoProvider) {
-    self.handler = handler
-    self.provider = provider
-  }
-
-  public func Receive() throws -> Echo_EchoRequest {
-    let done = NSCondition()
-    var requestMessage : Echo_EchoRequest?
-    try self.handler.receiveMessage() {(requestData) in
-      if let requestData = requestData {
-        requestMessage = try! Echo_EchoRequest(protobuf:requestData)
-      }
-      done.lock()
-      done.signal()
-      done.unlock()
-    }
-    done.lock()
-    done.wait()
-    done.unlock()
-    if requestMessage == nil {
-      throw Echo_EchoServerError.endOfStream
-    }
-    return requestMessage!
-  }
-
-  public func Send(_ response: Echo_EchoResponse) throws {
-    try handler.sendResponse(message:response.serializeProtobuf()) {}
-  }
-
-  public func Close() {
-    let done = NSCondition()
-    try! self.handler.sendStatus(statusCode: 0,
-                                 statusMessage: "OK",
-                                 trailingMetadata: Metadata()) {
-                                  done.lock()
-                                  done.signal()
-                                  done.unlock()
-    }
-    done.lock()
-    done.wait()
-    done.unlock()
-  }
-
-  fileprivate func run(queue:DispatchQueue) {
-    do {
-      try self.handler.sendMetadata(initialMetadata:Metadata()) {
-        queue.async {
-          try! self.provider.update(session:self)
-        }
-      }
-    } catch (let callError) {
-      print("grpc error: \(callError)")
-    }
-  }
-}
+//-{% for method in service.method %}
+//-{% if not method.clientStreaming and not method.serverStreaming %}
+//-{% include "server-session-unary.swift" %}
+//-{% endif %}
+//-{% if not method.clientStreaming and method.serverStreaming %}
+//-{% include "server-session-serverstreaming.swift" %}
+//-{% endif %}
+//-{% if method.clientStreaming and not method.serverStreaming %}
+//-{% include "server-session-clientstreaming.swift" %}
+//-{% endif %}
+//-{% if method.clientStreaming and method.serverStreaming %}
+//-{% include "server-session-bidistreaming.swift" %}
+//-{% endif %}
+//-{% endfor %}
 
 
 //
 //
 // main server for generated service
 // main server for generated service
@@ -272,18 +121,14 @@ public class Echo_EchoServer {
         + " from " + handler.caller)
         + " from " + handler.caller)
 
 
       switch handler.method {
       switch handler.method {
-      case "/echo.Echo/Get":
-        Echo_EchoGetSession(handler:handler, provider:provider).run(queue:queue)
-      case "/echo.Echo/Expand":
-        Echo_EchoExpandSession(handler:handler, provider:provider).run(queue:queue)
-      case "/echo.Echo/Collect":
-        Echo_EchoCollectSession(handler:handler, provider:provider).run(queue:queue)
-      case "/echo.Echo/Update":
-        Echo_EchoUpdateSession(handler:handler, provider:provider).run(queue:queue)
+	  //-{% for method in service.method %}
+      case "{{ .|callpath:protoFile,service,method }}":
+        {{ .|sessionname:protoFile,service,method }}(handler:handler, provider:provider).run(queue:queue)
+	  //-{% endfor %}
       default:
       default:
         break // handle unknown requests
         break // handle unknown requests
       }
       }
     }
     }
   }
   }
 }
 }
-
+//-{% endfor %}