client-call-unary.swift 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. /// {{ method|methodDescriptorName }} (Unary)
  2. {{ access }} final class {{ .|call:file,service,method }} {
  3. private var call : Call
  4. /// Create a call.
  5. fileprivate init(_ channel: Channel) {
  6. self.call = channel.makeCall("{{ .|path:file,service,method }}")
  7. }
  8. /// Run the call. Blocks until the reply is received.
  9. /// - Throws: `BinaryEncodingError` if encoding fails. `CallError` if fails to call. `{{ .|clienterror:file,service }}` if receives no response.
  10. fileprivate func run(request: {{ method|input }},
  11. metadata: Metadata) throws -> {{ method|output }} {
  12. let sem = DispatchSemaphore(value: 0)
  13. var returnCallResult : CallResult!
  14. var returnResponse : {{ method|output }}?
  15. _ = try start(request:request, metadata:metadata) {response, callResult in
  16. returnResponse = response
  17. returnCallResult = callResult
  18. sem.signal()
  19. }
  20. _ = sem.wait(timeout: DispatchTime.distantFuture)
  21. if let returnResponse = returnResponse {
  22. return returnResponse
  23. } else {
  24. throw {{ .|clienterror:file,service }}.error(c: returnCallResult)
  25. }
  26. }
  27. /// Start the call. Nonblocking.
  28. /// - Throws: `BinaryEncodingError` if encoding fails. `CallError` if fails to call.
  29. fileprivate func start(request: {{ method|input }},
  30. metadata: Metadata,
  31. completion: @escaping ({{ method|output }}?, CallResult)->())
  32. throws -> {{ .|call:file,service,method }} {
  33. let requestData = try request.serializedData()
  34. try call.start(.unary,
  35. metadata:metadata,
  36. message:requestData)
  37. {(callResult) in
  38. if let responseData = callResult.resultData,
  39. let response = try? {{ method|output }}(serializedData:responseData) {
  40. completion(response, callResult)
  41. } else {
  42. completion(nil, callResult)
  43. }
  44. }
  45. return self
  46. }
  47. /// Cancel the call.
  48. {{ access }} func cancel() {
  49. call.cancel()
  50. }
  51. }