2
0

ReflectionServiceV1Alpha.swift 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. /*
  2. * Copyright 2023, gRPC Authors All rights reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. import Foundation
  17. import GRPC
  18. import SwiftProtobuf
  19. @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
  20. internal final class ReflectionServiceProviderV1Alpha:
  21. Grpc_Reflection_V1alpha_ServerReflectionAsyncProvider
  22. {
  23. private let protoRegistry: ReflectionServiceData
  24. internal init(fileDescriptorProtos: [Google_Protobuf_FileDescriptorProto]) throws {
  25. self.protoRegistry = try ReflectionServiceData(
  26. fileDescriptors: fileDescriptorProtos
  27. )
  28. }
  29. internal func _findFileByFileName(
  30. _ fileName: String
  31. ) -> Result<Grpc_Reflection_V1alpha_ServerReflectionResponse.OneOf_MessageResponse, GRPCStatus> {
  32. return self.protoRegistry
  33. .serialisedFileDescriptorProtosForDependenciesOfFile(named: fileName)
  34. .map { fileDescriptorProtos in
  35. Grpc_Reflection_V1alpha_ServerReflectionResponse.OneOf_MessageResponse
  36. .fileDescriptorResponse(
  37. .with {
  38. $0.fileDescriptorProto = fileDescriptorProtos
  39. }
  40. )
  41. }
  42. }
  43. internal func findFileByFileName(
  44. _ fileName: String,
  45. request: Grpc_Reflection_V1alpha_ServerReflectionRequest
  46. ) -> Grpc_Reflection_V1alpha_ServerReflectionResponse {
  47. let result = self._findFileByFileName(fileName)
  48. return result.makeResponse(request: request)
  49. }
  50. internal func getServicesNames(
  51. request: Grpc_Reflection_V1alpha_ServerReflectionRequest
  52. ) throws -> Grpc_Reflection_V1alpha_ServerReflectionResponse {
  53. var listServicesResponse = Grpc_Reflection_V1alpha_ListServiceResponse()
  54. listServicesResponse.service = self.protoRegistry.serviceNames.map { serviceName in
  55. Grpc_Reflection_V1alpha_ServiceResponse.with {
  56. $0.name = serviceName
  57. }
  58. }
  59. return Grpc_Reflection_V1alpha_ServerReflectionResponse(
  60. request: request,
  61. messageResponse: .listServicesResponse(listServicesResponse)
  62. )
  63. }
  64. internal func findFileBySymbol(
  65. _ symbolName: String,
  66. request: Grpc_Reflection_V1alpha_ServerReflectionRequest
  67. ) -> Grpc_Reflection_V1alpha_ServerReflectionResponse {
  68. let result = self.protoRegistry.nameOfFileContainingSymbol(
  69. named: symbolName
  70. ).flatMap {
  71. self._findFileByFileName($0)
  72. }
  73. return result.makeResponse(request: request)
  74. }
  75. internal func findFileByExtension(
  76. extensionRequest: Grpc_Reflection_V1alpha_ExtensionRequest,
  77. request: Grpc_Reflection_V1alpha_ServerReflectionRequest
  78. ) -> Grpc_Reflection_V1alpha_ServerReflectionResponse {
  79. let result = self.protoRegistry.nameOfFileContainingExtension(
  80. extendeeName: extensionRequest.containingType,
  81. fieldNumber: extensionRequest.extensionNumber
  82. ).flatMap {
  83. self._findFileByFileName($0)
  84. }
  85. return result.makeResponse(request: request)
  86. }
  87. internal func findExtensionsFieldNumbersOfType(
  88. named typeName: String,
  89. request: Grpc_Reflection_V1alpha_ServerReflectionRequest
  90. ) -> Grpc_Reflection_V1alpha_ServerReflectionResponse {
  91. let result = self.protoRegistry.extensionsFieldNumbersOfType(
  92. named: typeName
  93. ).map { fieldNumbers in
  94. Grpc_Reflection_V1alpha_ServerReflectionResponse.OneOf_MessageResponse
  95. .allExtensionNumbersResponse(
  96. Grpc_Reflection_V1alpha_ExtensionNumberResponse.with {
  97. $0.baseTypeName = typeName
  98. $0.extensionNumber = fieldNumbers
  99. }
  100. )
  101. }
  102. return result.makeResponse(request: request)
  103. }
  104. internal func serverReflectionInfo(
  105. requestStream: GRPCAsyncRequestStream<Grpc_Reflection_V1alpha_ServerReflectionRequest>,
  106. responseStream: GRPCAsyncResponseStreamWriter<Grpc_Reflection_V1alpha_ServerReflectionResponse>,
  107. context: GRPCAsyncServerCallContext
  108. ) async throws {
  109. for try await request in requestStream {
  110. switch request.messageRequest {
  111. case let .fileByFilename(fileName):
  112. let response = self.findFileByFileName(
  113. fileName,
  114. request: request
  115. )
  116. try await responseStream.send(response)
  117. case .listServices:
  118. let response = try self.getServicesNames(request: request)
  119. try await responseStream.send(response)
  120. case let .fileContainingSymbol(symbolName):
  121. let response = self.findFileBySymbol(
  122. symbolName,
  123. request: request
  124. )
  125. try await responseStream.send(response)
  126. case let .fileContainingExtension(extensionRequest):
  127. let response = self.findFileByExtension(
  128. extensionRequest: extensionRequest,
  129. request: request
  130. )
  131. try await responseStream.send(response)
  132. case let .allExtensionNumbersOfType(typeName):
  133. let response = self.findExtensionsFieldNumbersOfType(
  134. named: typeName,
  135. request: request
  136. )
  137. try await responseStream.send(response)
  138. default:
  139. let response = Grpc_Reflection_V1alpha_ServerReflectionResponse(
  140. request: request,
  141. messageResponse: .errorResponse(
  142. Grpc_Reflection_V1alpha_ErrorResponse.with {
  143. $0.errorCode = Int32(GRPCStatus.Code.unimplemented.rawValue)
  144. $0.errorMessage = "The request is not implemented."
  145. }
  146. )
  147. )
  148. try await responseStream.send(response)
  149. }
  150. }
  151. }
  152. }
  153. extension Grpc_Reflection_V1alpha_ServerReflectionResponse {
  154. init(
  155. request: Grpc_Reflection_V1alpha_ServerReflectionRequest,
  156. messageResponse: Grpc_Reflection_V1alpha_ServerReflectionResponse.OneOf_MessageResponse
  157. ) {
  158. self = .with {
  159. $0.validHost = request.host
  160. $0.originalRequest = request
  161. $0.messageResponse = messageResponse
  162. }
  163. }
  164. }
  165. extension Result<Grpc_Reflection_V1alpha_ServerReflectionResponse.OneOf_MessageResponse, GRPCStatus>
  166. {
  167. func recover() -> Result<
  168. Grpc_Reflection_V1alpha_ServerReflectionResponse.OneOf_MessageResponse, Never
  169. > {
  170. self.flatMapError { status in
  171. let error = Grpc_Reflection_V1alpha_ErrorResponse.with {
  172. $0.errorCode = Int32(status.code.rawValue)
  173. $0.errorMessage = status.message ?? ""
  174. }
  175. return .success(.errorResponse(error))
  176. }
  177. }
  178. func makeResponse(
  179. request: Grpc_Reflection_V1alpha_ServerReflectionRequest
  180. ) -> Grpc_Reflection_V1alpha_ServerReflectionResponse {
  181. let result = self.recover().attachRequest(request)
  182. return result.get()
  183. }
  184. }
  185. extension Result
  186. where Success == Grpc_Reflection_V1alpha_ServerReflectionResponse.OneOf_MessageResponse {
  187. func attachRequest(
  188. _ request: Grpc_Reflection_V1alpha_ServerReflectionRequest
  189. ) -> Result<Grpc_Reflection_V1alpha_ServerReflectionResponse, Failure> {
  190. self.map { message in
  191. Grpc_Reflection_V1alpha_ServerReflectionResponse(request: request, messageResponse: message)
  192. }
  193. }
  194. }
  195. #if compiler(<6.0)
  196. extension Result where Failure == Never {
  197. func get() -> Success {
  198. switch self {
  199. case .success(let success):
  200. return success
  201. case .failure:
  202. fatalError("Unreachable")
  203. }
  204. }
  205. }
  206. #endif