[Swift] Moves grpc example to grpc/examples (#6479)
authormustiikhalil <mustii@mmk.one>
Sat, 20 Feb 2021 20:07:48 +0000 (23:07 +0300)
committerGitHub <noreply@github.com>
Sat, 20 Feb 2021 20:07:48 +0000 (23:07 +0300)
Updates generated Code

Removes grpc generation code from tests dir

Small fix to generate.sh

16 files changed:
grpc/examples/generate.sh
grpc/examples/swift/Greeter/Package.swift [new file with mode: 0644]
grpc/examples/swift/Greeter/README.md [new file with mode: 0644]
grpc/examples/swift/Greeter/Sources/Model/greeter.grpc.swift [new file with mode: 0644]
grpc/examples/swift/Greeter/Sources/Model/greeter_generated.swift [new file with mode: 0644]
grpc/examples/swift/Greeter/Sources/client/main.swift [new file with mode: 0644]
grpc/examples/swift/Greeter/Sources/server/main.swift [new file with mode: 0644]
tests/FlatBuffers.GRPC.Swift/Package.swift [deleted file]
tests/FlatBuffers.GRPC.Swift/README.md [deleted file]
tests/FlatBuffers.GRPC.Swift/Sources/Model/greeter.fbs [deleted file]
tests/FlatBuffers.GRPC.Swift/Sources/Model/greeter.grpc.swift [deleted file]
tests/FlatBuffers.GRPC.Swift/Sources/Model/greeter_generated.swift [deleted file]
tests/FlatBuffers.GRPC.Swift/Sources/client/main.swift [deleted file]
tests/FlatBuffers.GRPC.Swift/Sources/server/main.swift [deleted file]
tests/FlatBuffers.Test.Swift/SwiftTest.sh
tests/generate_code.sh

index e70f28d601458f465aa4180927cf5c9de126e7c8..0d2a900dc0a6888861d2981b18e81db3e0fd663a 100644 (file)
@@ -15,12 +15,18 @@ cd go/
 cd greeter
 fbc --go ${generator}
 
-cd ../..
+cd ${current_dir}
+
+cd swift/
+
+cd Greeter/Sources/Model
+fbc --swift ${generator}
+
+cd ${current_dir}
 
 cd ts/
 
 cd greeter/src
 fbc --ts ${generator}
-cd ..
 
-cd ../..
\ No newline at end of file
+cd ${current_dir}
\ No newline at end of file
diff --git a/grpc/examples/swift/Greeter/Package.swift b/grpc/examples/swift/Greeter/Package.swift
new file mode 100644 (file)
index 0000000..385b56f
--- /dev/null
@@ -0,0 +1,58 @@
+// swift-tools-version:5.1
+/*
+ * Copyright 2020 Google Inc. 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 PackageDescription
+
+let package = Package(
+  name: "Greeter",
+  platforms: [
+    .iOS(.v11),
+    .macOS(.v10_14),
+  ],
+  dependencies: [
+    .package(path: "../../../../swift"),
+    .package(url: "https://github.com/grpc/grpc-swift.git", .exact("1.0.0-alpha.24")),
+  ],
+  targets: [
+    // Targets are the basic building blocks of a package. A target can define a module or a test suite.
+    // Targets can depend on other targets in this package, and on products in packages which this package depends on.
+    .target(
+      name: "Model",
+      dependencies: [
+        "GRPC",
+        "FlatBuffers",
+      ],
+      path: "Sources/Model"),
+
+    // Client for the Greeter example
+    .target(
+      name: "Client",
+      dependencies: [
+        "GRPC",
+        "Model",
+      ],
+      path: "Sources/client"),
+
+    // Server for the Greeter example
+    .target(
+      name: "Server",
+      dependencies: [
+        "GRPC",
+        "Model",
+      ],
+      path: "Sources/server"),
+  ])
diff --git a/grpc/examples/swift/Greeter/README.md b/grpc/examples/swift/Greeter/README.md
new file mode 100644 (file)
index 0000000..1632b78
--- /dev/null
@@ -0,0 +1,7 @@
+# FlatBuffers.GRPC.Swift
+
+The following is Swift example on how GRPC would be with Swift Flatbuffers, you can simply run the following commands:
+
+`swift run Server`
+
+`swift run Client {port} {name}`
diff --git a/grpc/examples/swift/Greeter/Sources/Model/greeter.grpc.swift b/grpc/examples/swift/Greeter/Sources/Model/greeter.grpc.swift
new file mode 100644 (file)
index 0000000..0f29f19
--- /dev/null
@@ -0,0 +1,145 @@
+// Generated GRPC code for FlatBuffers swift!
+/// The following code is generated by the Flatbuffers library which might not be in sync with grpc-swift
+/// in case of an issue please open github issue, though it would be maintained
+
+// swiftlint:disable all
+// swiftformat:disable all
+
+import Foundation
+import GRPC
+import NIO
+import NIOHTTP1
+import FlatBuffers
+
+public protocol GRPCFlatBufPayload: GRPCPayload, FlatBufferGRPCMessage {}
+public extension GRPCFlatBufPayload {
+  init(serializedByteBuffer: inout NIO.ByteBuffer) throws {
+    self.init(byteBuffer: FlatBuffers.ByteBuffer(contiguousBytes: serializedByteBuffer.readableBytesView, count: serializedByteBuffer.readableBytes))
+  }
+  func serialize(into buffer: inout NIO.ByteBuffer) throws {
+    let buf = UnsafeRawBufferPointer(start: self.rawPointer, count: Int(self.size))
+    buffer.writeBytes(buf)
+  }
+}
+extension Message: GRPCFlatBufPayload {}
+
+/// Usage: instantiate models_GreeterServiceClient, then call methods of this protocol to make API calls.
+public protocol models_GreeterClientProtocol: GRPCClient {
+
+  var serviceName: String { get }
+
+  var interceptors: models_GreeterClientInterceptorFactoryProtocol? { get }
+
+  func SayHello(
+    _ request: Message<models_HelloRequest>
+    , callOptions: CallOptions?
+  ) -> UnaryCall<Message<models_HelloRequest>, Message<models_HelloReply>>
+
+  func SayManyHellos(
+    _ request: Message<models_HelloRequest>
+    , callOptions: CallOptions?,
+    handler: @escaping (Message<models_HelloReply>) -> Void
+  ) -> ServerStreamingCall<Message<models_HelloRequest>, Message<models_HelloReply>>
+
+}
+
+extension models_GreeterClientProtocol {
+
+  public var serviceName: String { "models.Greeter" }
+
+  public func SayHello(
+    _ request: Message<models_HelloRequest>
+    , callOptions: CallOptions? = nil
+  ) -> UnaryCall<Message<models_HelloRequest>, Message<models_HelloReply>> {
+    return self.makeUnaryCall(
+      path: "/models.Greeter/SayHello",
+      request: request,
+      callOptions: callOptions ?? self.defaultCallOptions,
+      interceptors: self.interceptors?.makeSayHelloInterceptors() ?? []
+    )
+  }
+
+  public func SayManyHellos(
+    _ request: Message<models_HelloRequest>
+    , callOptions: CallOptions? = nil,
+    handler: @escaping (Message<models_HelloReply>) -> Void
+  ) -> ServerStreamingCall<Message<models_HelloRequest>, Message<models_HelloReply>> {
+    return self.makeServerStreamingCall(
+      path: "/models.Greeter/SayManyHellos",
+      request: request,
+      callOptions: callOptions ?? self.defaultCallOptions,
+      interceptors: self.interceptors?.makeSayManyHellosInterceptors() ?? [],
+      handler: handler
+    )
+  }
+}
+
+public protocol models_GreeterClientInterceptorFactoryProtocol {
+  /// - Returns: Interceptors to use when invoking 'SayHello'.
+  func makeSayHelloInterceptors() -> [ClientInterceptor<Message<models_HelloRequest>, Message<models_HelloReply>>]
+
+  /// - Returns: Interceptors to use when invoking 'SayManyHellos'.
+  func makeSayManyHellosInterceptors() -> [ClientInterceptor<Message<models_HelloRequest>, Message<models_HelloReply>>]
+
+}
+
+public final class models_GreeterServiceClient: models_GreeterClientProtocol {
+  public let channel: GRPCChannel
+  public var defaultCallOptions: CallOptions
+  public var interceptors: models_GreeterClientInterceptorFactoryProtocol?
+
+  public init(
+    channel: GRPCChannel,
+    defaultCallOptions: CallOptions = CallOptions(),
+    interceptors: models_GreeterClientInterceptorFactoryProtocol? = nil
+  ) {
+    self.channel = channel
+    self.defaultCallOptions = defaultCallOptions
+    self.interceptors = interceptors
+  }
+}
+
+public protocol models_GreeterProvider: CallHandlerProvider {
+  var interceptors: models_GreeterServerInterceptorFactoryProtocol? { get }
+  func SayHello(request: Message<models_HelloRequest>, context: StatusOnlyCallContext) -> EventLoopFuture<Message<models_HelloReply>>
+  func SayManyHellos(request: Message<models_HelloRequest>, context: StreamingResponseCallContext<Message<models_HelloReply>>) -> EventLoopFuture<GRPCStatus>
+}
+
+public extension models_GreeterProvider {
+
+  var serviceName: Substring { return "models.Greeter" }
+
+  func handle(method name: Substring, context: CallHandlerContext) -> GRPCServerHandlerProtocol? {
+    switch name {
+    case "SayHello":
+    return UnaryServerHandler(
+      context: context,
+      requestDeserializer: GRPCPayloadDeserializer<Message<models_HelloRequest>>(),
+      responseSerializer: GRPCPayloadSerializer<Message<models_HelloReply>>(),
+      interceptors: self.interceptors?.makeSayHelloInterceptors() ?? [],
+      userFunction: self.SayHello(request:context:))
+
+    case "SayManyHellos":
+    return ServerStreamingServerHandler(
+      context: context,
+      requestDeserializer: GRPCPayloadDeserializer<Message<models_HelloRequest>>(),
+      responseSerializer: GRPCPayloadSerializer<Message<models_HelloReply>>(),
+      interceptors: self.interceptors?.makeSayManyHellosInterceptors() ?? [],
+      userFunction: self.SayManyHellos(request:context:))
+
+    default: return nil;
+    }
+  }
+
+}
+
+public protocol models_GreeterServerInterceptorFactoryProtocol {
+  /// - Returns: Interceptors to use when handling 'SayHello'.
+  ///   Defaults to calling `self.makeInterceptors()`.
+  func makeSayHelloInterceptors() -> [ServerInterceptor<Message<models_HelloRequest>, Message<models_HelloReply>>]
+
+  /// - Returns: Interceptors to use when handling 'SayManyHellos'.
+  ///   Defaults to calling `self.makeInterceptors()`.
+  func makeSayManyHellosInterceptors() -> [ServerInterceptor<Message<models_HelloRequest>, Message<models_HelloReply>>]
+
+}
diff --git a/grpc/examples/swift/Greeter/Sources/Model/greeter_generated.swift b/grpc/examples/swift/Greeter/Sources/Model/greeter_generated.swift
new file mode 100644 (file)
index 0000000..4021e95
--- /dev/null
@@ -0,0 +1,70 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+// swiftlint:disable all
+// swiftformat:disable all
+
+import FlatBuffers
+
+public struct models_HelloReply: FlatBufferObject {
+
+  static func validateVersion() { FlatBuffersVersion_1_12_0() }
+  public var __buffer: ByteBuffer! { return _accessor.bb }
+  private var _accessor: Table
+
+  public static func getRootAsHelloReply(bb: ByteBuffer) -> models_HelloReply { return models_HelloReply(Table(bb: bb, position: Int32(bb.read(def: UOffset.self, position: bb.reader)) + Int32(bb.reader))) }
+
+  private init(_ t: Table) { _accessor = t }
+  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }
+
+  private enum VTOFFSET: VOffset {
+    case message = 4
+    var v: Int32 { Int32(self.rawValue) }
+    var p: VOffset { self.rawValue }
+  }
+
+  public var message: String? { let o = _accessor.offset(VTOFFSET.message.v); return o == 0 ? nil : _accessor.string(at: o) }
+  public var messageSegmentArray: [UInt8]? { return _accessor.getVector(at: VTOFFSET.message.v) }
+  public static func startHelloReply(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }
+  public static func add(message: Offset<String>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: message, at: VTOFFSET.message.p) }
+  public static func endHelloReply(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset<UOffset> { let end = Offset<UOffset>(offset: fbb.endTable(at: start)); return end }
+  public static func createHelloReply(
+    _ fbb: inout FlatBufferBuilder,
+    messageOffset message: Offset<String> = Offset()
+  ) -> Offset<UOffset> {
+    let __start = models_HelloReply.startHelloReply(&fbb)
+    models_HelloReply.add(message: message, &fbb)
+    return models_HelloReply.endHelloReply(&fbb, start: __start)
+  }
+}
+
+public struct models_HelloRequest: FlatBufferObject {
+
+  static func validateVersion() { FlatBuffersVersion_1_12_0() }
+  public var __buffer: ByteBuffer! { return _accessor.bb }
+  private var _accessor: Table
+
+  public static func getRootAsHelloRequest(bb: ByteBuffer) -> models_HelloRequest { return models_HelloRequest(Table(bb: bb, position: Int32(bb.read(def: UOffset.self, position: bb.reader)) + Int32(bb.reader))) }
+
+  private init(_ t: Table) { _accessor = t }
+  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }
+
+  private enum VTOFFSET: VOffset {
+    case name = 4
+    var v: Int32 { Int32(self.rawValue) }
+    var p: VOffset { self.rawValue }
+  }
+
+  public var name: String? { let o = _accessor.offset(VTOFFSET.name.v); return o == 0 ? nil : _accessor.string(at: o) }
+  public var nameSegmentArray: [UInt8]? { return _accessor.getVector(at: VTOFFSET.name.v) }
+  public static func startHelloRequest(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }
+  public static func add(name: Offset<String>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: name, at: VTOFFSET.name.p) }
+  public static func endHelloRequest(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset<UOffset> { let end = Offset<UOffset>(offset: fbb.endTable(at: start)); return end }
+  public static func createHelloRequest(
+    _ fbb: inout FlatBufferBuilder,
+    nameOffset name: Offset<String> = Offset()
+  ) -> Offset<UOffset> {
+    let __start = models_HelloRequest.startHelloRequest(&fbb)
+    models_HelloRequest.add(name: name, &fbb)
+    return models_HelloRequest.endHelloRequest(&fbb, start: __start)
+  }
+}
+
diff --git a/grpc/examples/swift/Greeter/Sources/client/main.swift b/grpc/examples/swift/Greeter/Sources/client/main.swift
new file mode 100644 (file)
index 0000000..a6b1130
--- /dev/null
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2021 Google Inc. 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 FlatBuffers
+import GRPC
+import Logging
+import Model
+import NIO
+
+// Quieten the logs.
+LoggingSystem.bootstrap {
+  var handler = StreamLogHandler.standardOutput(label: $0)
+  handler.logLevel = .critical
+  return handler
+}
+
+func greet(name: String, client greeter: models_GreeterServiceClient) {
+  // Form the request with the name, if one was provided.
+  var builder = FlatBufferBuilder()
+  let nameOff = builder.create(string: name)
+  let root = models_HelloRequest.createHelloRequest(
+    &builder,
+    nameOffset: nameOff)
+  builder.finish(offset: root)
+
+  // Make the RPC call to the server.
+  let sayHello = greeter.SayHello(Message<models_HelloRequest>(builder: &builder))
+
+  // wait() on the response to stop the program from exiting before the response is received.
+  do {
+    let response = try sayHello.response.wait()
+    print("Greeter SayHello received: \(response.object.message ?? "Unknown")")
+  } catch {
+    print("Greeter failed: \(error)")
+  }
+
+  let surname = builder.create(string: name)
+  let manyRoot = models_HelloRequest.createHelloRequest(
+    &builder,
+    nameOffset: surname)
+  builder.finish(offset: manyRoot)
+
+  let call = greeter.SayManyHellos(Message(builder: &builder)) { message in
+    print("Greeter SayManyHellos received: \(message.object.message  ?? "Unknown")")
+  }
+
+  let status = try! call.status.recover { _ in .processingError }.wait()
+  if status.code != .ok {
+    print("RPC failed: \(status)")
+  }
+}
+
+func main(args: [String]) {
+  // arg0 (dropped) is the program name. We expect arg1 to be the port, and arg2 (optional) to be
+  // the name sent in the request.
+  let arg1 = args.dropFirst(1).first
+  let arg2 = args.dropFirst(2).first
+
+  switch (arg1.flatMap(Int.init), arg2) {
+  case (.none, _):
+    print("Usage: PORT [NAME]")
+    exit(1)
+
+  case let (.some(port), name):
+    // Setup an `EventLoopGroup` for the connection to run on.
+    //
+    // See: https://github.com/apple/swift-nio#eventloops-and-eventloopgroups
+    let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
+
+    // Make sure the group is shutdown when we're done with it.
+    defer {
+      try! group.syncShutdownGracefully()
+    }
+
+    // Configure the channel, we're not using TLS so the connection is `insecure`.
+    let channel = ClientConnection.insecure(group: group)
+      .connect(host: "localhost", port: port)
+
+    // Close the connection when we're done with it.
+    defer {
+      try! channel.close().wait()
+    }
+
+    // Provide the connection to the generated client.
+    let greeter = models_GreeterServiceClient(channel: channel)
+
+    // Do the greeting.
+    greet(name: name ?? "FlatBuffers!", client: greeter)
+  }
+}
+
+main(args: CommandLine.arguments)
diff --git a/grpc/examples/swift/Greeter/Sources/server/main.swift b/grpc/examples/swift/Greeter/Sources/server/main.swift
new file mode 100644 (file)
index 0000000..af1c555
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2021 Google Inc. 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 FlatBuffers
+import GRPC
+import Logging
+import Model
+import NIO
+
+class Greeter: models_GreeterProvider {
+
+  var interceptors: models_GreeterServerInterceptorFactoryProtocol?
+
+  let greetings: [String]
+
+  init() {
+    greetings = ["Hi", "Hallo", "Ciao"]
+  }
+
+  func SayHello(
+    request: Message<models_HelloRequest>,
+    context: StatusOnlyCallContext) -> EventLoopFuture<Message<models_HelloReply>>
+  {
+    let recipient = request.object.name ?? "Stranger"
+
+    var builder = FlatBufferBuilder()
+    let off = builder.create(string: "Hello \(recipient)")
+    let root = models_HelloReply.createHelloReply(&builder, messageOffset: off)
+    builder.finish(offset: root)
+    return context.eventLoop.makeSucceededFuture(Message<models_HelloReply>(builder: &builder))
+  }
+
+  func SayManyHellos(
+    request: Message<models_HelloRequest>,
+    context: StreamingResponseCallContext<Message<models_HelloReply>>) -> EventLoopFuture<GRPCStatus>
+  {
+    for name in greetings {
+      var builder = FlatBufferBuilder()
+      let off = builder.create(string: "\(name) \(request.object.name ?? "Unknown")")
+      let root = models_HelloReply.createHelloReply(&builder, messageOffset: off)
+      builder.finish(offset: root)
+      _ = context.sendResponse(Message<models_HelloReply>(builder: &builder))
+    }
+    return context.eventLoop.makeSucceededFuture(.ok)
+  }
+}
+
+// Quieten the logs.
+LoggingSystem.bootstrap {
+  var handler = StreamLogHandler.standardOutput(label: $0)
+  handler.logLevel = .critical
+  return handler
+}
+
+let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
+defer {
+  try! group.syncShutdownGracefully()
+}
+
+// Create some configuration for the server:
+let configuration = Server.Configuration(
+  target: .hostAndPort("localhost", 0),
+  eventLoopGroup: group,
+  serviceProviders: [Greeter()])
+
+// Start the server and print its address once it has started.
+let server = Server.start(configuration: configuration)
+server.map {
+  $0.channel.localAddress
+}.whenSuccess { address in
+  print("server started on port \(address!.port!)")
+}
+
+// Wait on the server's `onClose` future to stop the program from exiting.
+_ = try server.flatMap {
+  $0.onClose
+}.wait()
diff --git a/tests/FlatBuffers.GRPC.Swift/Package.swift b/tests/FlatBuffers.GRPC.Swift/Package.swift
deleted file mode 100644 (file)
index 5692439..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-// swift-tools-version:5.1
-/*
- * Copyright 2020 Google Inc. 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 PackageDescription
-
-let package = Package(
-  name: "FlatBuffers.GRPC.Swift",
-  platforms: [
-    .iOS(.v11),
-    .macOS(.v10_14),
-  ],
-  dependencies: [
-    .package(path: "../../swift"),
-    .package(url: "https://github.com/grpc/grpc-swift.git", .exact("1.0.0-alpha.24")),
-  ],
-  targets: [
-    // Targets are the basic building blocks of a package. A target can define a module or a test suite.
-    // Targets can depend on other targets in this package, and on products in packages which this package depends on.
-    .target(
-      name: "Model",
-      dependencies: [
-        "GRPC",
-        "FlatBuffers",
-      ],
-      path: "Sources/Model"),
-
-    // Client for the Greeter example
-    .target(
-      name: "Client",
-      dependencies: [
-        "GRPC",
-        "Model",
-      ],
-      path: "Sources/client"),
-
-    // Server for the Greeter example
-    .target(
-      name: "Server",
-      dependencies: [
-        "GRPC",
-        "Model",
-      ],
-      path: "Sources/server"),
-  ])
diff --git a/tests/FlatBuffers.GRPC.Swift/README.md b/tests/FlatBuffers.GRPC.Swift/README.md
deleted file mode 100644 (file)
index 1632b78..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-# FlatBuffers.GRPC.Swift
-
-The following is Swift example on how GRPC would be with Swift Flatbuffers, you can simply run the following commands:
-
-`swift run Server`
-
-`swift run Client {port} {name}`
diff --git a/tests/FlatBuffers.GRPC.Swift/Sources/Model/greeter.fbs b/tests/FlatBuffers.GRPC.Swift/Sources/Model/greeter.fbs
deleted file mode 100644 (file)
index 811303c..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-table HelloReply {
-  message:string;
-}
-
-table HelloRequest {
-  name:string;
-}
-
-table ManyHellosRequest {
-  name:string;
-  num_greetings:int;
-}
-
-rpc_service Greeter {
-  SayHello(HelloRequest):HelloReply;
-  SayManyHellos(ManyHellosRequest):HelloReply (streaming: "server");
-}
diff --git a/tests/FlatBuffers.GRPC.Swift/Sources/Model/greeter.grpc.swift b/tests/FlatBuffers.GRPC.Swift/Sources/Model/greeter.grpc.swift
deleted file mode 100644 (file)
index aacffe5..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-// Generated GRPC code for FlatBuffers swift!
-/// The following code is generated by the Flatbuffers library which might not be in sync with grpc-swift
-/// in case of an issue please open github issue, though it would be maintained
-
-// swiftlint:disable all
-// swiftformat:disable all
-
-import Foundation
-import GRPC
-import NIO
-import NIOHTTP1
-import FlatBuffers
-
-public protocol GRPCFlatBufPayload: GRPCPayload, FlatBufferGRPCMessage {}
-public extension GRPCFlatBufPayload {
-  init(serializedByteBuffer: inout NIO.ByteBuffer) throws {
-    self.init(byteBuffer: FlatBuffers.ByteBuffer(contiguousBytes: serializedByteBuffer.readableBytesView, count: serializedByteBuffer.readableBytes))
-  }
-  func serialize(into buffer: inout NIO.ByteBuffer) throws {
-    let buf = UnsafeRawBufferPointer(start: self.rawPointer, count: Int(self.size))
-    buffer.writeBytes(buf)
-  }
-}
-extension Message: GRPCFlatBufPayload {}
-
-/// Usage: instantiate GreeterServiceClient, then call methods of this protocol to make API calls.
-public protocol GreeterClientProtocol: GRPCClient {
-
-  var serviceName: String { get }
-
-  var interceptors: GreeterClientInterceptorFactoryProtocol? { get }
-
-  func SayHello(
-    _ request: Message<HelloRequest>
-    , callOptions: CallOptions?
-  ) -> UnaryCall<Message<HelloRequest>, Message<HelloReply>>
-
-  func SayManyHellos(
-    _ request: Message<ManyHellosRequest>
-    , callOptions: CallOptions?,
-    handler: @escaping (Message<HelloReply>) -> Void
-  ) -> ServerStreamingCall<Message<ManyHellosRequest>, Message<HelloReply>>
-
-}
-
-extension GreeterClientProtocol {
-
-  public var serviceName: String { "Greeter" }
-
-  public func SayHello(
-    _ request: Message<HelloRequest>
-    , callOptions: CallOptions? = nil
-  ) -> UnaryCall<Message<HelloRequest>, Message<HelloReply>> {
-    return self.makeUnaryCall(
-      path: "/Greeter/SayHello",
-      request: request,
-      callOptions: callOptions ?? self.defaultCallOptions,
-      interceptors: self.interceptors?.makeSayHelloInterceptors() ?? []
-    )
-  }
-
-  public func SayManyHellos(
-    _ request: Message<ManyHellosRequest>
-    , callOptions: CallOptions? = nil,
-    handler: @escaping (Message<HelloReply>) -> Void
-  ) -> ServerStreamingCall<Message<ManyHellosRequest>, Message<HelloReply>> {
-    return self.makeServerStreamingCall(
-      path: "/Greeter/SayManyHellos",
-      request: request,
-      callOptions: callOptions ?? self.defaultCallOptions,
-      interceptors: self.interceptors?.makeSayManyHellosInterceptors() ?? [],
-      handler: handler
-    )
-  }
-}
-
-public protocol GreeterClientInterceptorFactoryProtocol {
-  /// - Returns: Interceptors to use when invoking 'SayHello'.
-  func makeSayHelloInterceptors() -> [ClientInterceptor<Message<HelloRequest>, Message<HelloReply>>]
-
-  /// - Returns: Interceptors to use when invoking 'SayManyHellos'.
-  func makeSayManyHellosInterceptors() -> [ClientInterceptor<Message<ManyHellosRequest>, Message<HelloReply>>]
-
-}
-
-public final class GreeterServiceClient: GreeterClientProtocol {
-  public let channel: GRPCChannel
-  public var defaultCallOptions: CallOptions
-  public var interceptors: GreeterClientInterceptorFactoryProtocol?
-
-  public init(
-    channel: GRPCChannel,
-    defaultCallOptions: CallOptions = CallOptions(),
-    interceptors: GreeterClientInterceptorFactoryProtocol? = nil
-  ) {
-    self.channel = channel
-    self.defaultCallOptions = defaultCallOptions
-    self.interceptors = interceptors
-  }
-}
-
-public protocol GreeterProvider: CallHandlerProvider {
-  var interceptors: GreeterServerInterceptorFactoryProtocol? { get }
-  func SayHello(request: Message<HelloRequest>, context: StatusOnlyCallContext) -> EventLoopFuture<Message<HelloReply>>
-  func SayManyHellos(request: Message<ManyHellosRequest>, context: StreamingResponseCallContext<Message<HelloReply>>) -> EventLoopFuture<GRPCStatus>
-}
-
-public extension GreeterProvider {
-
-  var serviceName: Substring { return "Greeter" }
-
-  func handle(method name: Substring, context: CallHandlerContext) -> GRPCServerHandlerProtocol? {
-    switch name {
-    case "SayHello":
-    return UnaryServerHandler(
-      context: context,
-      requestDeserializer: GRPCPayloadDeserializer<Message<HelloRequest>>(),
-      responseSerializer: GRPCPayloadSerializer<Message<HelloReply>>(),
-      interceptors: self.interceptors?.makeSayHelloInterceptors() ?? [],
-      userFunction: self.SayHello(request:context:))
-
-    case "SayManyHellos":
-    return ServerStreamingServerHandler(
-      context: context,
-      requestDeserializer: GRPCPayloadDeserializer<Message<ManyHellosRequest>>(),
-      responseSerializer: GRPCPayloadSerializer<Message<HelloReply>>(),
-      interceptors: self.interceptors?.makeSayManyHellosInterceptors() ?? [],
-      userFunction: self.SayManyHellos(request:context:))
-
-    default: return nil;
-    }
-  }
-
-}
-
-public protocol GreeterServerInterceptorFactoryProtocol {
-  /// - Returns: Interceptors to use when handling 'SayHello'.
-  ///   Defaults to calling `self.makeInterceptors()`.
-  func makeSayHelloInterceptors() -> [ServerInterceptor<Message<HelloRequest>, Message<HelloReply>>]
-
-  /// - Returns: Interceptors to use when handling 'SayManyHellos'.
-  ///   Defaults to calling `self.makeInterceptors()`.
-  func makeSayManyHellosInterceptors() -> [ServerInterceptor<Message<ManyHellosRequest>, Message<HelloReply>>]
-
-}
diff --git a/tests/FlatBuffers.GRPC.Swift/Sources/Model/greeter_generated.swift b/tests/FlatBuffers.GRPC.Swift/Sources/Model/greeter_generated.swift
deleted file mode 100644 (file)
index 11664f5..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-// automatically generated by the FlatBuffers compiler, do not modify
-// swiftlint:disable all
-// swiftformat:disable all
-
-import FlatBuffers
-
-public struct HelloReply: FlatBufferObject {
-
-  static func validateVersion() { FlatBuffersVersion_1_12_0() }
-  public var __buffer: ByteBuffer! { return _accessor.bb }
-  private var _accessor: Table
-
-  public static func getRootAsHelloReply(bb: ByteBuffer) -> HelloReply { return HelloReply(Table(bb: bb, position: Int32(bb.read(def: UOffset.self, position: bb.reader)) + Int32(bb.reader))) }
-
-  private init(_ t: Table) { _accessor = t }
-  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }
-
-  private enum VTOFFSET: VOffset {
-    case message = 4
-    var v: Int32 { Int32(self.rawValue) }
-    var p: VOffset { self.rawValue }
-  }
-
-  public var message: String? { let o = _accessor.offset(VTOFFSET.message.v); return o == 0 ? nil : _accessor.string(at: o) }
-  public var messageSegmentArray: [UInt8]? { return _accessor.getVector(at: VTOFFSET.message.v) }
-  public static func startHelloReply(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }
-  public static func add(message: Offset<String>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: message, at: VTOFFSET.message.p) }
-  public static func endHelloReply(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset<UOffset> { let end = Offset<UOffset>(offset: fbb.endTable(at: start)); return end }
-  public static func createHelloReply(
-    _ fbb: inout FlatBufferBuilder,
-    messageOffset message: Offset<String> = Offset()
-  ) -> Offset<UOffset> {
-    let __start = HelloReply.startHelloReply(&fbb)
-    HelloReply.add(message: message, &fbb)
-    return HelloReply.endHelloReply(&fbb, start: __start)
-  }
-}
-
-public struct HelloRequest: FlatBufferObject {
-
-  static func validateVersion() { FlatBuffersVersion_1_12_0() }
-  public var __buffer: ByteBuffer! { return _accessor.bb }
-  private var _accessor: Table
-
-  public static func getRootAsHelloRequest(bb: ByteBuffer) -> HelloRequest { return HelloRequest(Table(bb: bb, position: Int32(bb.read(def: UOffset.self, position: bb.reader)) + Int32(bb.reader))) }
-
-  private init(_ t: Table) { _accessor = t }
-  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }
-
-  private enum VTOFFSET: VOffset {
-    case name = 4
-    var v: Int32 { Int32(self.rawValue) }
-    var p: VOffset { self.rawValue }
-  }
-
-  public var name: String? { let o = _accessor.offset(VTOFFSET.name.v); return o == 0 ? nil : _accessor.string(at: o) }
-  public var nameSegmentArray: [UInt8]? { return _accessor.getVector(at: VTOFFSET.name.v) }
-  public static func startHelloRequest(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }
-  public static func add(name: Offset<String>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: name, at: VTOFFSET.name.p) }
-  public static func endHelloRequest(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset<UOffset> { let end = Offset<UOffset>(offset: fbb.endTable(at: start)); return end }
-  public static func createHelloRequest(
-    _ fbb: inout FlatBufferBuilder,
-    nameOffset name: Offset<String> = Offset()
-  ) -> Offset<UOffset> {
-    let __start = HelloRequest.startHelloRequest(&fbb)
-    HelloRequest.add(name: name, &fbb)
-    return HelloRequest.endHelloRequest(&fbb, start: __start)
-  }
-}
-
-public struct ManyHellosRequest: FlatBufferObject {
-
-  static func validateVersion() { FlatBuffersVersion_1_12_0() }
-  public var __buffer: ByteBuffer! { return _accessor.bb }
-  private var _accessor: Table
-
-  public static func getRootAsManyHellosRequest(bb: ByteBuffer) -> ManyHellosRequest { return ManyHellosRequest(Table(bb: bb, position: Int32(bb.read(def: UOffset.self, position: bb.reader)) + Int32(bb.reader))) }
-
-  private init(_ t: Table) { _accessor = t }
-  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }
-
-  private enum VTOFFSET: VOffset {
-    case name = 4
-    case numGreetings = 6
-    var v: Int32 { Int32(self.rawValue) }
-    var p: VOffset { self.rawValue }
-  }
-
-  public var name: String? { let o = _accessor.offset(VTOFFSET.name.v); return o == 0 ? nil : _accessor.string(at: o) }
-  public var nameSegmentArray: [UInt8]? { return _accessor.getVector(at: VTOFFSET.name.v) }
-  public var numGreetings: Int32 { let o = _accessor.offset(VTOFFSET.numGreetings.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int32.self, at: o) }
-  public static func startManyHellosRequest(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 2) }
-  public static func add(name: Offset<String>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: name, at: VTOFFSET.name.p) }
-  public static func add(numGreetings: Int32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: numGreetings, def: 0, at: VTOFFSET.numGreetings.p) }
-  public static func endManyHellosRequest(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset<UOffset> { let end = Offset<UOffset>(offset: fbb.endTable(at: start)); return end }
-  public static func createManyHellosRequest(
-    _ fbb: inout FlatBufferBuilder,
-    nameOffset name: Offset<String> = Offset(),
-    numGreetings: Int32 = 0
-  ) -> Offset<UOffset> {
-    let __start = ManyHellosRequest.startManyHellosRequest(&fbb)
-    ManyHellosRequest.add(name: name, &fbb)
-    ManyHellosRequest.add(numGreetings: numGreetings, &fbb)
-    return ManyHellosRequest.endManyHellosRequest(&fbb, start: __start)
-  }
-}
-
diff --git a/tests/FlatBuffers.GRPC.Swift/Sources/client/main.swift b/tests/FlatBuffers.GRPC.Swift/Sources/client/main.swift
deleted file mode 100644 (file)
index dac26a3..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright 2021 Google Inc. 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 FlatBuffers
-import GRPC
-import Logging
-import Model
-import NIO
-
-// Quieten the logs.
-LoggingSystem.bootstrap {
-  var handler = StreamLogHandler.standardOutput(label: $0)
-  handler.logLevel = .critical
-  return handler
-}
-
-func greet(name: String, client greeter: GreeterServiceClient) {
-  // Form the request with the name, if one was provided.
-  var builder = FlatBufferBuilder()
-  let name = builder.create(string: name)
-  let root = HelloRequest.createHelloRequest(&builder, offsetOfName: name)
-  builder.finish(offset: root)
-
-  // Make the RPC call to the server.
-  let sayHello = greeter.SayHello(Message<HelloRequest>(builder: &builder))
-
-  // wait() on the response to stop the program from exiting before the response is received.
-  do {
-    let response = try sayHello.response.wait()
-    print("Greeter received: \(response.object.message)")
-  } catch {
-    print("Greeter failed: \(error)")
-  }
-
-  let surname = builder.create(string: "Name")
-  let manyRoot = ManyHellosRequest.createManyHellosRequest(
-    &builder,
-    offsetOfName: surname,
-    numGreetings: 2)
-  builder.finish(offset: manyRoot)
-
-  let call = greeter.SayManyHellos(Message(builder: &builder)) { message in
-    print(message.object.message)
-  }
-
-  let status = try! call.status.recover { _ in .processingError }.wait()
-  if status.code != .ok {
-    print("RPC failed: \(status)")
-  }
-}
-
-func main(args: [String]) {
-  // arg0 (dropped) is the program name. We expect arg1 to be the port, and arg2 (optional) to be
-  // the name sent in the request.
-  let arg1 = args.dropFirst(1).first
-  let arg2 = args.dropFirst(2).first
-
-  switch (arg1.flatMap(Int.init), arg2) {
-  case (.none, _):
-    print("Usage: PORT [NAME]")
-    exit(1)
-
-  case let (.some(port), name):
-    // Setup an `EventLoopGroup` for the connection to run on.
-    //
-    // See: https://github.com/apple/swift-nio#eventloops-and-eventloopgroups
-    let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
-
-    // Make sure the group is shutdown when we're done with it.
-    defer {
-      try! group.syncShutdownGracefully()
-    }
-
-    // Configure the channel, we're not using TLS so the connection is `insecure`.
-    let channel = ClientConnection.insecure(group: group)
-      .connect(host: "localhost", port: port)
-
-    // Close the connection when we're done with it.
-    defer {
-      try! channel.close().wait()
-    }
-
-    // Provide the connection to the generated client.
-    let greeter = GreeterServiceClient(channel: channel)
-
-    // Do the greeting.
-    greet(name: name ?? "Hello FlatBuffers!", client: greeter)
-  }
-}
-
-main(args: CommandLine.arguments)
diff --git a/tests/FlatBuffers.GRPC.Swift/Sources/server/main.swift b/tests/FlatBuffers.GRPC.Swift/Sources/server/main.swift
deleted file mode 100644 (file)
index d5274c1..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright 2021 Google Inc. 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 FlatBuffers
-import GRPC
-import Logging
-import Model
-import NIO
-
-class Greeter: GreeterProvider {
-
-  var interceptors: GreeterServerInterceptorFactoryProtocol?
-
-  var hellos: [Message<HelloReply>] = []
-
-  init() {
-    let names = ["Stranger1", "Stranger2", "Stranger4", "Stranger3", "Stranger5", "Stranger6"]
-    for name in names {
-      var builder = FlatBufferBuilder()
-      let off = builder.create(string: name)
-      let root = HelloReply.createHelloReply(&builder, offsetOfMessage: off)
-      builder.finish(offset: root)
-      hellos.append(Message(builder: &builder))
-    }
-  }
-
-  func SayHello(
-    request: Message<HelloRequest>,
-    context: StatusOnlyCallContext) -> EventLoopFuture<Message<HelloReply>>
-  {
-    let recipient = request.object.name ?? "Stranger"
-
-    var builder = FlatBufferBuilder()
-    let off = builder.create(string: recipient)
-    let root = HelloReply.createHelloReply(&builder, offsetOfMessage: off)
-    builder.finish(offset: root)
-    return context.eventLoop.makeSucceededFuture(Message<HelloReply>(builder: &builder))
-  }
-
-  func SayManyHellos(
-    request: Message<ManyHellosRequest>,
-    context: StreamingResponseCallContext<Message<HelloReply>>) -> EventLoopFuture<GRPCStatus>
-  {
-    for _ in 0..<Int(request.object.numGreetings) {
-      let index = Int.random(in: 0..<hellos.count)
-      _ = context.sendResponse(hellos[index])
-    }
-    return context.eventLoop.makeSucceededFuture(.ok)
-  }
-}
-
-// Quieten the logs.
-LoggingSystem.bootstrap {
-  var handler = StreamLogHandler.standardOutput(label: $0)
-  handler.logLevel = .critical
-  return handler
-}
-
-let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
-defer {
-  try! group.syncShutdownGracefully()
-}
-
-// Create some configuration for the server:
-let configuration = Server.Configuration(
-  target: .hostAndPort("localhost", 0),
-  eventLoopGroup: group,
-  serviceProviders: [Greeter()])
-
-// Start the server and print its address once it has started.
-let server = Server.start(configuration: configuration)
-server.map {
-  $0.channel.localAddress
-}.whenSuccess { address in
-  print("server started on port \(address!.port!)")
-}
-
-// Wait on the server's `onClose` future to stop the program from exiting.
-_ = try server.flatMap {
-  $0.onClose
-}.wait()
index 7b907be5115bccf15f36cac59ed6c090d49db6a3..06b2d6f18d44a7db784e6860723094ce0a87d6c9 100755 (executable)
@@ -3,10 +3,6 @@ cd ..
 test_dir=`pwd`
 alias fbc='${test_dir}/../flatc'
 
-cd FlatBuffers.GRPC.Swift/Sources/Model
-fbc --swift --grpc greeter.fbs
-cd ${test_dir}
-
 cd ${swift_dir}/Tests/FlatBuffers.Test.SwiftTests
 fbc --swift --gen-mutable --grpc --gen-object-api -I ${test_dir}/include_test ${test_dir}/monster_test.fbs ${test_dir}/union_vector/union_vector.fbs
 fbc --swift ${test_dir}/optional_scalars.fbs
index a308611c91c7693df439bd7193191e3dcee169ff..baa70e72a2d354705c9974c5f3d6f505c665264a 100755 (executable)
@@ -75,10 +75,6 @@ $working_dir/../flatc --swift ${working_dir}/optional_scalars.fbs
 $working_dir/../flatc --swift --gen-object-api ${working_dir}/more_defaults.fbs
 cd $working_dir
 
-cd FlatBuffers.GRPC.Swift/Sources/Model
-$working_dir/../flatc --swift --grpc greeter.fbs
-cd $working_dir
-
 # Tests if the --filename-suffix and --filename-ext works and produces the same
 # outputs.
 ../flatc --cpp --filename-suffix _suffix --filename-ext hpp $TEST_NOINCL_FLAGS $TEST_CPP_FLAGS -I include_test monster_test.fbs