JSONCodeGeneratorRequest.swift 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /*
  2. * Copyright 2025, 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. struct JSONCodeGeneratorRequest: Codable {
  18. /// The service to generate.
  19. var service: ServiceSchema
  20. /// Configuration for the generation.
  21. var config: GeneratorConfig
  22. init(service: ServiceSchema, config: GeneratorConfig) {
  23. self.service = service
  24. self.config = config
  25. }
  26. init(from decoder: any Decoder) throws {
  27. let container = try decoder.container(keyedBy: CodingKeys.self)
  28. self.service = try container.decode(ServiceSchema.self, forKey: .service)
  29. self.config = try container.decodeIfPresent(GeneratorConfig.self, forKey: .config) ?? .defaults
  30. }
  31. }
  32. struct ServiceSchema: Codable {
  33. var name: String
  34. var methods: [Method]
  35. struct Method: Codable {
  36. var name: String
  37. var input: String
  38. var output: String
  39. var kind: Kind
  40. enum Kind: String, Codable {
  41. case unary = "unary"
  42. case clientStreaming = "client_streaming"
  43. case serverStreaming = "server_streaming"
  44. case bidiStreaming = "bidi_streaming"
  45. var streamsInput: Bool {
  46. switch self {
  47. case .unary, .serverStreaming:
  48. return false
  49. case .clientStreaming, .bidiStreaming:
  50. return true
  51. }
  52. }
  53. var streamsOutput: Bool {
  54. switch self {
  55. case .unary, .clientStreaming:
  56. return false
  57. case .serverStreaming, .bidiStreaming:
  58. return true
  59. }
  60. }
  61. }
  62. }
  63. }
  64. struct GeneratorConfig: Codable {
  65. enum AccessLevel: String, Codable {
  66. case `internal`
  67. case `package`
  68. var capitalized: String {
  69. switch self {
  70. case .internal:
  71. return "Internal"
  72. case .package:
  73. return "Package"
  74. }
  75. }
  76. }
  77. var generateClient: Bool
  78. var generateServer: Bool
  79. var accessLevel: AccessLevel
  80. var accessLevelOnImports: Bool
  81. static var defaults: Self {
  82. GeneratorConfig(
  83. generateClient: true,
  84. generateServer: true,
  85. accessLevel: .internal,
  86. accessLevelOnImports: false
  87. )
  88. }
  89. init(
  90. generateClient: Bool,
  91. generateServer: Bool,
  92. accessLevel: AccessLevel,
  93. accessLevelOnImports: Bool
  94. ) {
  95. self.generateClient = generateClient
  96. self.generateServer = generateServer
  97. self.accessLevel = accessLevel
  98. self.accessLevelOnImports = accessLevelOnImports
  99. }
  100. init(from decoder: any Decoder) throws {
  101. let container = try decoder.container(keyedBy: CodingKeys.self)
  102. let defaults = Self.defaults
  103. let generateClient = try container.decodeIfPresent(Bool.self, forKey: .generateClient)
  104. self.generateClient = generateClient ?? defaults.generateClient
  105. let generateServer = try container.decodeIfPresent(Bool.self, forKey: .generateServer)
  106. self.generateServer = generateServer ?? defaults.generateServer
  107. let accessLevel = try container.decodeIfPresent(AccessLevel.self, forKey: .accessLevel)
  108. self.accessLevel = accessLevel ?? defaults.accessLevel
  109. let accessLevelOnImports = try container.decodeIfPresent(
  110. Bool.self,
  111. forKey: .accessLevelOnImports
  112. )
  113. self.accessLevelOnImports = accessLevelOnImports ?? defaults.accessLevelOnImports
  114. }
  115. }