Skip to content

Commit 08309ec

Browse files
committed
Update main Echo sample to use Commander.
1 parent 3771193 commit 08309ec

File tree

3 files changed

+146
-178
lines changed

3 files changed

+146
-178
lines changed
Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11

22
all:
3-
swift build
3+
swift build -c release
4+
cp .build/release/Echo .
5+
6+
project:
7+
swift package generate-xcodeproj
48

59
clean :
6-
rm -rf Packages
7-
rm -rf .build
8-
rm -f Package.pins Package.resolved
10+
rm -rf Packages googleapis .build
11+
rm -f Package.pins Echo google.json
12+
rm -rf Package.resolved Echo.xcodeproj Echo

Examples/Echo/PackageManager/Package.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ import PackageDescription
1717
let package = Package (
1818
name: "Echo",
1919
dependencies: [
20-
.Package(url: "https://github.com/grpc/grpc-swift.git", Version(0,3,0)),
20+
.Package(url: "https://github.com/grpc/grpc-swift.git", Version(0,3,1)),
2121
.Package(url: "https://github.com/apple/swift-protobuf.git", Version(1,0,2)),
22+
.Package(url: "https://github.com/kylef/Commander.git", Version(0,8,0)),
2223
]
2324
)
Lines changed: 136 additions & 173 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2016, gRPC Authors All rights reserved.
2+
* Copyright 2017, gRPC Authors All rights reserved.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -14,201 +14,164 @@
1414
* limitations under the License.
1515
*/
1616
import Foundation
17-
import gRPC
18-
import CgRPC
1917
import Dispatch
18+
import gRPC
19+
import Commander
2020

21-
print("\(CommandLine.arguments)")
22-
23-
// server options
24-
var server : Bool = false
25-
26-
// client options
27-
var client : String = ""
28-
var message : String = "Testing 1 2 3"
29-
var address : String = ""
30-
var port : String = ""
31-
32-
// self-test mode
33-
var test : Bool = false
34-
35-
// general configuration
36-
var useSSL : Bool = false
37-
38-
var i : Int = 0
39-
while i < Int(CommandLine.argc) {
40-
let arg = CommandLine.arguments[i]
41-
i = i + 1
42-
if i == 1 {
43-
continue // skip the first argument
44-
}
45-
46-
if arg == "test" {
47-
test = true
48-
} else if arg == "serve" {
49-
server = true
50-
} else if (arg == "get") || (arg == "expand") || (arg == "collect") || (arg == "update") {
51-
client = arg
52-
} else if arg == "-ssl" {
53-
useSSL = true
54-
} else if arg == "-m" && (i < Int(CommandLine.argc)) {
55-
message = CommandLine.arguments[i]
56-
i = i + 1
57-
} else if arg == "-a" && (i < Int(CommandLine.argc)) {
58-
address = CommandLine.arguments[i]
59-
i = i + 1
60-
} else if arg == "-p" && (i < Int(CommandLine.argc)) {
61-
port = CommandLine.arguments[i]
62-
i = i + 1
63-
}
64-
}
65-
66-
if address == "" {
67-
if server {
68-
address = "0.0.0.0"
69-
} else {
70-
address = "localhost"
71-
}
72-
}
73-
74-
if port == "" {
75-
if useSSL {
76-
port = "8443"
77-
} else {
78-
port = "8081"
79-
}
80-
}
81-
82-
print(address + ":" + port + "\n")
83-
84-
let sem = DispatchSemaphore(value: 0)
85-
86-
gRPC.initialize()
87-
88-
if server {
89-
let echoProvider = EchoProvider()
90-
var echoServer: Echo_EchoServer!
91-
92-
if useSSL {
93-
print("Starting secure server")
94-
let certificateURL = URL(fileURLWithPath:"ssl.crt")
95-
let keyURL = URL(fileURLWithPath:"ssl.key")
96-
echoServer = Echo_EchoServer(address:address + ":" + port,
97-
certificateURL:certificateURL,
98-
keyURL:keyURL,
99-
provider:echoProvider)
100-
} else {
101-
print("Starting insecure server")
102-
echoServer = Echo_EchoServer(address:address + ":" + port,
103-
provider:echoProvider)
104-
}
105-
echoServer.start()
106-
// Block to keep the main thread from finishing while the server runs.
107-
// This server never exits. Kill the process to stop it.
108-
_ = sem.wait(timeout: DispatchTime.distantFuture)
21+
// Common flags and options
22+
let sslFlag = Flag("ssl", description:"if true, use SSL for connections")
23+
func addressOption(_ address:String) -> Option<String> {
24+
return Option("address", default:address, description:"address of server")
10925
}
110-
111-
if client != "" {
112-
do {
113-
114-
print("Starting client")
115-
26+
let portOption = Option("port", default:"8081",
27+
description:"port of server")
28+
let messageOption = Option("message", default:"Testing 1 2 3",
29+
description:"message to send")
30+
31+
// Helper function for client actions
32+
func buildEchoService(_ ssl:Bool, _ address:String, _ port:String, _ message:String)
33+
-> Echo_EchoService {
11634
var service : Echo_EchoService
117-
if useSSL {
35+
if ssl {
11836
let certificateURL = URL(fileURLWithPath:"ssl.crt")
11937
let certificates = try! String(contentsOf: certificateURL)
120-
service = Echo_EchoService(address:address + ":" + port, certificates:certificates, host:"example.com")
121-
service.host = "example.com" // sample override
38+
service = Echo_EchoService(address:address + ":" + port,
39+
certificates:certificates,
40+
host:"example.com")
41+
service.host = "example.com"
12242
} else {
12343
service = Echo_EchoService(address:address + ":" + port, secure:false)
12444
}
125-
12645
service.metadata = Metadata(["x-goog-api-key":"YOUR_API_KEY",
127-
"x-ios-bundle-identifier":"com.google.echo"])
46+
"x-ios-bundle-identifier":"io.grpc.echo"])
47+
return service
48+
}
12849

129-
// Unary
130-
if client == "get" {
131-
var requestMessage = Echo_EchoRequest()
132-
requestMessage.text = message
133-
print("Sending: " + requestMessage.text)
134-
let responseMessage = try service.get(requestMessage)
135-
print("get received: " + responseMessage.text)
50+
Group {
51+
52+
$0.command("serve",
53+
sslFlag,
54+
addressOption("0.0.0.0"),
55+
portOption,
56+
description:"Run an echo server.")
57+
{ (ssl, address, port) in
58+
let sem = DispatchSemaphore(value: 0)
59+
let echoProvider = EchoProvider()
60+
if ssl {
61+
print("Starting secure server")
62+
let certificateURL = URL(fileURLWithPath:"ssl.crt")
63+
let keyURL = URL(fileURLWithPath:"ssl.key")
64+
if let echoServer = Echo_EchoServer(address:address + ":" + port,
65+
certificateURL:certificateURL,
66+
keyURL:keyURL,
67+
provider:echoProvider) {
68+
echoServer.start()
69+
}
70+
} else {
71+
print("Starting insecure server")
72+
let echoServer = Echo_EchoServer(address:address + ":" + port,
73+
provider:echoProvider)
74+
echoServer.start()
13675
}
76+
// This blocks to keep the main thread from finishing while the server runs,
77+
// but the server never exits. Kill the process to stop it.
78+
_ = sem.wait(timeout: DispatchTime.distantFuture)
79+
}
80+
81+
$0.command("get", sslFlag, addressOption("localhost"), portOption, messageOption,
82+
description: "Perform a unary get().")
83+
{(ssl, address, port, message) in
84+
let service = buildEchoService(ssl, address, port, message)
85+
var requestMessage = Echo_EchoRequest()
86+
requestMessage.text = message
87+
print("Sending: " + requestMessage.text)
88+
let responseMessage = try service.get(requestMessage)
89+
print("get received: " + responseMessage.text)
90+
}
91+
92+
$0.command("expand", sslFlag, addressOption("localhost"), portOption, messageOption,
93+
description: "Perform a server-streaming expand().")
94+
{(ssl, address, port, message) in
95+
let service = buildEchoService(ssl, address, port, message)
96+
var requestMessage = Echo_EchoRequest()
97+
requestMessage.text = message
98+
print("Sending: " + requestMessage.text)
99+
let sem = DispatchSemaphore(value: 0)
100+
let expandCall = try service.expand(requestMessage) {result in
101+
print("result \(result)")
102+
sem.signal()
103+
}
104+
_ = sem.wait(timeout: DispatchTime.distantFuture)
105+
var running = true
106+
while running {
107+
do {
108+
let responseMessage = try expandCall.receive()
109+
print("Received: \(responseMessage.text)")
110+
} catch Echo_EchoClientError.endOfStream {
111+
print("expand closed")
112+
running = false
113+
}
114+
}
115+
}
137116

138-
// Server streaming
139-
if client == "expand" {
117+
$0.command("collect", sslFlag, addressOption("localhost"), portOption, messageOption,
118+
description: "Perform a client-streaming collect().")
119+
{(ssl, address, port, message) in
120+
let service = buildEchoService(ssl, address, port, message)
121+
let sem = DispatchSemaphore(value: 0)
122+
let collectCall = try service.collect() {result in
123+
print("result \(result)")
124+
sem.signal()
125+
}
126+
_ = sem.wait(timeout: DispatchTime.distantFuture)
127+
let parts = message.components(separatedBy:" ")
128+
for part in parts {
140129
var requestMessage = Echo_EchoRequest()
141-
requestMessage.text = message
142-
print("Sending: " + requestMessage.text)
143-
let expandCall = try service.expand(requestMessage) {result in }
130+
requestMessage.text = part
131+
print("Sending: " + part)
132+
try collectCall.send(requestMessage) {error in print(error)}
133+
sleep(1)
134+
}
135+
let responseMessage = try collectCall.closeAndReceive()
136+
print("Received: \(responseMessage.text)")
137+
}
138+
139+
$0.command("update", sslFlag, addressOption("localhost"), portOption, messageOption,
140+
description: "Perform a bidirectional-streaming update().")
141+
{(ssl, address, port, message) in
142+
let service = buildEchoService(ssl, address, port, message)
143+
let sem = DispatchSemaphore(value: 0)
144+
let updateCall = try service.update() {result in
145+
print("result \(result)")
146+
sem.signal()
147+
}
148+
_ = sem.wait(timeout: DispatchTime.distantFuture)
149+
150+
DispatchQueue.global().async {
144151
var running = true
145152
while running {
146153
do {
147-
let responseMessage = try expandCall.receive()
154+
let responseMessage = try updateCall.receive()
148155
print("Received: \(responseMessage.text)")
149156
} catch Echo_EchoClientError.endOfStream {
150-
print("expand closed")
157+
print("update closed")
158+
sem.signal()
151159
running = false
160+
} catch (let error) {
161+
print("error: \(error)")
152162
}
153163
}
154164
}
155-
156-
// Client streaming
157-
if client == "collect" {
158-
let collectCall = try service.collect() {result in }
159-
160-
let parts = message.components(separatedBy:" ")
161-
for part in parts {
162-
var requestMessage = Echo_EchoRequest()
163-
requestMessage.text = part
164-
print("Sending: " + part)
165-
try collectCall.send(requestMessage) {error in print(error)}
166-
sleep(1)
167-
}
168-
169-
let responseMessage = try collectCall.closeAndReceive()
170-
print("Received: \(responseMessage.text)")
171-
}
172-
173-
// Bidirectional streaming
174-
if client == "update" {
175-
let updateCall = try service.update() {result in}
176-
177-
DispatchQueue.global().async {
178-
var running = true
179-
while running {
180-
do {
181-
let responseMessage = try updateCall.receive()
182-
print("Received: \(responseMessage.text)")
183-
} catch Echo_EchoClientError.endOfStream {
184-
print("update closed")
185-
sem.signal()
186-
running = false
187-
} catch (let error) {
188-
print("error: \(error)")
189-
}
190-
}
191-
}
192-
193-
let parts = message.components(separatedBy:" ")
194-
for part in parts {
195-
var requestMessage = Echo_EchoRequest()
196-
requestMessage.text = part
197-
print("Sending: " + requestMessage.text)
198-
try updateCall.send(requestMessage) {error in print(error)}
199-
sleep(1)
200-
}
201-
try updateCall.closeSend()
202-
203-
// Wait for the call to complete.
204-
_ = sem.wait(timeout: DispatchTime.distantFuture)
165+
let parts = message.components(separatedBy:" ")
166+
for part in parts {
167+
var requestMessage = Echo_EchoRequest()
168+
requestMessage.text = part
169+
print("Sending: " + requestMessage.text)
170+
try updateCall.send(requestMessage) {error in print(error)}
171+
sleep(1)
205172
}
206-
207-
} catch let error {
208-
print("error:\(error)")
173+
try updateCall.closeSend()
174+
_ = sem.wait(timeout: DispatchTime.distantFuture)
209175
}
210-
}
211176

212-
if test {
213-
print("self test")
214-
}
177+
}.run()

0 commit comments

Comments
 (0)