Parcourir la source

Update main Echo sample to use Commander.

Tim Burks il y a 8 ans
Parent
commit
08309ecd3e

+ 8 - 4
Examples/Echo/PackageManager/Makefile

@@ -1,8 +1,12 @@
 
 all:
-	swift build
+	swift build -c release
+	cp .build/release/Echo .
+
+project:
+	swift package generate-xcodeproj
 
 clean :
-	rm -rf Packages
-	rm -rf .build
-	rm -f Package.pins Package.resolved
+	rm -rf Packages googleapis .build
+	rm -f Package.pins Echo google.json
+	rm -rf Package.resolved Echo.xcodeproj Echo

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

@@ -17,7 +17,8 @@ import PackageDescription
 let package = Package (
     name: "Echo",
     dependencies: [
-        .Package(url: "https://github.com/grpc/grpc-swift.git", Version(0,3,0)),
+        .Package(url: "https://github.com/grpc/grpc-swift.git", Version(0,3,1)),
         .Package(url: "https://github.com/apple/swift-protobuf.git", Version(1,0,2)),
+        .Package(url: "https://github.com/kylef/Commander.git", Version(0,8,0)),
     ]
 )

+ 136 - 173
Examples/Echo/PackageManager/Sources/main.swift

@@ -1,5 +1,5 @@
 /*
- * Copyright 2016, gRPC Authors All rights reserved.
+ * 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.
@@ -14,201 +14,164 @@
  * limitations under the License.
  */
 import Foundation
-import gRPC
-import CgRPC
 import Dispatch
+import gRPC
+import Commander
 
-print("\(CommandLine.arguments)")
-
-// server options
-var server : Bool = false
-
-// client options
-var client : String = ""
-var message : String = "Testing 1 2 3"
-var address : String = ""
-var port : String = ""
-
-// self-test mode
-var test : Bool = false
-
-// general configuration
-var useSSL : Bool = false
-
-var i : Int = 0
-while i < Int(CommandLine.argc) {
-  let arg = CommandLine.arguments[i]
-  i = i + 1
-  if i == 1 {
-    continue // skip the first argument
-  }
-
-  if arg == "test" {
-    test = true
-  } else if arg == "serve" {
-    server = true
-  } else if (arg == "get") || (arg == "expand") || (arg == "collect") || (arg == "update") {
-    client = arg
-  } else if arg == "-ssl" {
-    useSSL = true
-  } else if arg == "-m" && (i < Int(CommandLine.argc)) {
-    message = CommandLine.arguments[i]
-    i = i + 1
-  } else if arg == "-a" && (i < Int(CommandLine.argc)) {
-    address = CommandLine.arguments[i]
-    i = i + 1
-  } else if arg == "-p" && (i < Int(CommandLine.argc)) {
-    port = CommandLine.arguments[i]
-    i = i + 1
-  }
-}
-
-if address == "" {
-  if server {
-    address = "0.0.0.0"
-  } else {
-    address = "localhost"
-  }
-}
-
-if port == "" {
-  if useSSL {
-    port = "8443"
-  } else {
-    port = "8081"
-  }
-}
-
-print(address + ":" + port + "\n")
-
-let sem = DispatchSemaphore(value: 0)
-
-gRPC.initialize()
-
-if server {
-  let echoProvider = EchoProvider()
-  var echoServer: Echo_EchoServer!
-
-  if useSSL {
-    print("Starting secure server")
-    let certificateURL = URL(fileURLWithPath:"ssl.crt")
-    let keyURL = URL(fileURLWithPath:"ssl.key")
-    echoServer = Echo_EchoServer(address:address + ":" + port,
-                                 certificateURL:certificateURL,
-                                 keyURL:keyURL,
-                                 provider:echoProvider)
-  } else {
-    print("Starting insecure server")
-    echoServer = Echo_EchoServer(address:address + ":" + port,
-                                 provider:echoProvider)
-  }
-  echoServer.start()
-  // Block to keep the main thread from finishing while the server runs.
-  // This server never exits. Kill the process to stop it.
-  _ = sem.wait(timeout: DispatchTime.distantFuture)
+// Common flags and options
+let sslFlag = Flag("ssl", description:"if true, use SSL for connections")
+func addressOption(_ address:String) -> Option<String> {
+  return Option("address", default:address, description:"address of server")
 }
-
-if client != "" {
-  do {
-
-    print("Starting client")
-
+let portOption = Option("port", default:"8081",
+                        description:"port of server")
+let messageOption = Option("message", default:"Testing 1 2 3",
+                           description:"message to send")
+
+// Helper function for client actions
+func buildEchoService(_ ssl:Bool, _ address:String, _ port:String, _ message:String)
+  -> Echo_EchoService {
     var service : Echo_EchoService
-    if useSSL {
+    if ssl {
       let certificateURL = URL(fileURLWithPath:"ssl.crt")
       let certificates = try! String(contentsOf: certificateURL)
-      service = Echo_EchoService(address:address + ":" + port, certificates:certificates, host:"example.com")
-      service.host = "example.com" // sample override
+      service = Echo_EchoService(address:address + ":" + port,
+                                 certificates:certificates,
+                                 host:"example.com")
+      service.host = "example.com"
     } else {
       service = Echo_EchoService(address:address + ":" + port, secure:false)
     }
-
     service.metadata = Metadata(["x-goog-api-key":"YOUR_API_KEY",
-                                 "x-ios-bundle-identifier":"com.google.echo"])
+                                 "x-ios-bundle-identifier":"io.grpc.echo"])
+    return service
+}
 
-    // Unary
-    if client == "get" {
-      var requestMessage = Echo_EchoRequest()
-      requestMessage.text = message
-      print("Sending: " + requestMessage.text)
-      let responseMessage = try service.get(requestMessage)
-      print("get received: " + responseMessage.text)
+Group {
+
+  $0.command("serve",
+             sslFlag,
+             addressOption("0.0.0.0"),
+             portOption,
+             description:"Run an echo server.")
+  { (ssl, address, port) in
+    let sem = DispatchSemaphore(value: 0)
+    let echoProvider = EchoProvider()
+    if ssl {
+      print("Starting secure server")
+      let certificateURL = URL(fileURLWithPath:"ssl.crt")
+      let keyURL = URL(fileURLWithPath:"ssl.key")
+      if let echoServer = Echo_EchoServer(address:address + ":" + port,
+                                          certificateURL:certificateURL,
+                                          keyURL:keyURL,
+                                          provider:echoProvider) {
+        echoServer.start()
+      }
+    } else {
+      print("Starting insecure server")
+      let echoServer = Echo_EchoServer(address:address + ":" + port,
+                                       provider:echoProvider)
+      echoServer.start()
     }
+    // This blocks to keep the main thread from finishing while the server runs,
+    // but the server never exits. Kill the process to stop it.
+    _ = sem.wait(timeout: DispatchTime.distantFuture)
+  }
+
+  $0.command("get", sslFlag, addressOption("localhost"), portOption, messageOption,
+             description: "Perform a unary get().")
+  {(ssl, address, port, message) in
+    let service = buildEchoService(ssl, address, port, message)
+    var requestMessage = Echo_EchoRequest()
+    requestMessage.text = message
+    print("Sending: " + requestMessage.text)
+    let responseMessage = try service.get(requestMessage)
+    print("get received: " + responseMessage.text)
+  }
+
+  $0.command("expand", sslFlag, addressOption("localhost"), portOption, messageOption,
+             description: "Perform a server-streaming expand().")
+  {(ssl, address, port, message) in
+    let service = buildEchoService(ssl, address, port, message)
+    var requestMessage = Echo_EchoRequest()
+    requestMessage.text = message
+    print("Sending: " + requestMessage.text)
+    let sem = DispatchSemaphore(value: 0)
+    let expandCall = try service.expand(requestMessage) {result in
+      print("result \(result)")
+      sem.signal()
+    }
+    _ = sem.wait(timeout: DispatchTime.distantFuture)
+    var running = true
+    while running {
+      do {
+        let responseMessage = try expandCall.receive()
+        print("Received: \(responseMessage.text)")
+      } catch Echo_EchoClientError.endOfStream {
+        print("expand closed")
+        running = false
+      }
+    }
+  }
 
-    // Server streaming
-    if client == "expand" {
+  $0.command("collect", sslFlag, addressOption("localhost"), portOption, messageOption,
+             description: "Perform a client-streaming collect().")
+  {(ssl, address, port, message) in
+    let service = buildEchoService(ssl, address, port, message)
+    let sem = DispatchSemaphore(value: 0)
+    let collectCall = try service.collect() {result in
+      print("result \(result)")
+      sem.signal()
+    }
+    _ = sem.wait(timeout: DispatchTime.distantFuture)
+    let parts = message.components(separatedBy:" ")
+    for part in parts {
       var requestMessage = Echo_EchoRequest()
-      requestMessage.text = message
-      print("Sending: " + requestMessage.text)
-      let expandCall = try service.expand(requestMessage) {result in }
+      requestMessage.text = part
+      print("Sending: " + part)
+      try collectCall.send(requestMessage) {error in print(error)}
+      sleep(1)
+    }
+    let responseMessage = try collectCall.closeAndReceive()
+    print("Received: \(responseMessage.text)")
+  }
+
+  $0.command("update", sslFlag, addressOption("localhost"), portOption, messageOption,
+             description: "Perform a bidirectional-streaming update().")
+  {(ssl, address, port, message) in
+    let service = buildEchoService(ssl, address, port, message)
+    let sem = DispatchSemaphore(value: 0)
+    let updateCall = try service.update() {result in
+      print("result \(result)")
+      sem.signal()
+    }
+    _ = sem.wait(timeout: DispatchTime.distantFuture)
+
+    DispatchQueue.global().async {
       var running = true
       while running {
         do {
-          let responseMessage = try expandCall.receive()
+          let responseMessage = try updateCall.receive()
           print("Received: \(responseMessage.text)")
         } catch Echo_EchoClientError.endOfStream {
-          print("expand closed")
+          print("update closed")
+          sem.signal()
           running = false
+        } catch (let error) {
+          print("error: \(error)")
         }
       }
     }
-
-    // Client streaming
-    if client == "collect" {
-      let collectCall = try service.collect() {result in }
-
-      let parts = message.components(separatedBy:" ")
-      for part in parts {
-        var requestMessage = Echo_EchoRequest()
-        requestMessage.text = part
-        print("Sending: " + part)
-        try collectCall.send(requestMessage) {error in print(error)}
-        sleep(1)
-      }
-
-      let responseMessage = try collectCall.closeAndReceive()
-      print("Received: \(responseMessage.text)")
-    }
-
-    // Bidirectional streaming
-    if client == "update" {
-      let updateCall = try service.update() {result in}
-
-      DispatchQueue.global().async {
-        var running = true
-        while running {
-          do {
-            let responseMessage = try updateCall.receive()
-            print("Received: \(responseMessage.text)")
-          } catch Echo_EchoClientError.endOfStream {
-            print("update closed")
-            sem.signal()
-            running = false
-          } catch (let error) {
-            print("error: \(error)")
-          }
-        }
-      }
-
-      let parts = message.components(separatedBy:" ")
-      for part in parts {
-        var requestMessage = Echo_EchoRequest()
-        requestMessage.text = part
-        print("Sending: " + requestMessage.text)
-        try updateCall.send(requestMessage) {error in print(error)}
-        sleep(1)
-      }
-      try updateCall.closeSend()
-
-      // Wait for the call to complete.
-      _ = sem.wait(timeout: DispatchTime.distantFuture)
+    let parts = message.components(separatedBy:" ")
+    for part in parts {
+      var requestMessage = Echo_EchoRequest()
+      requestMessage.text = part
+      print("Sending: " + requestMessage.text)
+      try updateCall.send(requestMessage) {error in print(error)}
+      sleep(1)
     }
-
-  } catch let error {
-    print("error:\(error)")
+    try updateCall.closeSend()
+    _ = sem.wait(timeout: DispatchTime.distantFuture)
   }
-}
 
-if test {
-  print("self test")
-}
+  }.run()