| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- /// {{ method|methodDescriptorName }} (Unary)
- {{ access }} final class {{ .|call:file,service,method }} {
- private var call : Call
- /// Create a call.
- fileprivate init(_ channel: Channel) {
- self.call = channel.makeCall("{{ .|path:file,service,method }}")
- }
- /// Run the call. Blocks until the reply is received.
- /// - Throws: `BinaryEncodingError` if encoding fails. `CallError` if fails to call. `{{ .|clienterror:file,service }}` if receives no response.
- fileprivate func run(request: {{ method|input }},
- metadata: Metadata) throws -> {{ method|output }} {
- let sem = DispatchSemaphore(value: 0)
- var returnCallResult : CallResult!
- var returnResponse : {{ method|output }}?
- _ = try start(request:request, metadata:metadata) {response, callResult in
- returnResponse = response
- returnCallResult = callResult
- sem.signal()
- }
- _ = sem.wait(timeout: DispatchTime.distantFuture)
- if let returnResponse = returnResponse {
- return returnResponse
- } else {
- throw {{ .|clienterror:file,service }}.error(c: returnCallResult)
- }
- }
- /// Start the call. Nonblocking.
- /// - Throws: `BinaryEncodingError` if encoding fails. `CallError` if fails to call.
- fileprivate func start(request: {{ method|input }},
- metadata: Metadata,
- completion: @escaping ({{ method|output }}?, CallResult)->())
- throws -> {{ .|call:file,service,method }} {
- let requestData = try request.serializedData()
- try call.start(.unary,
- metadata:metadata,
- message:requestData)
- {(callResult) in
- if let responseData = callResult.resultData,
- let response = try? {{ method|output }}(serializedData:responseData) {
- completion(response, callResult)
- } else {
- completion(nil, callResult)
- }
- }
- return self
- }
- /// Cancel the call.
- {{ access }} func cancel() {
- call.cancel()
- }
- }
|