FieldTypes.swift 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. // Sources/SwiftProtobuf/FieldTypes.swift - Proto data types
  2. //
  3. // Copyright (c) 2014 - 2016 Apple Inc. and the project authors
  4. // Licensed under Apache License v2.0 with Runtime Library Exception
  5. //
  6. // See LICENSE.txt for license information:
  7. // https://github.com/apple/swift-protobuf/blob/main/LICENSE.txt
  8. //
  9. // -----------------------------------------------------------------------------
  10. ///
  11. /// Serialization/deserialization support for each proto field type.
  12. ///
  13. /// Note that we cannot just extend the standard Int32, etc, types
  14. /// with serialization information since proto language supports
  15. /// distinct types (with different codings) that use the same
  16. /// in-memory representation. For example, proto "sint32" and
  17. /// "sfixed32" both are represented in-memory as Int32.
  18. ///
  19. /// These types are used generically and also passed into
  20. /// various coding/decoding functions to provide type-specific
  21. /// information.
  22. ///
  23. // -----------------------------------------------------------------------------
  24. import Foundation
  25. // Note: The protobuf- and JSON-specific methods here are defined
  26. // in ProtobufTypeAdditions.swift and JSONTypeAdditions.swift
  27. @preconcurrency
  28. public protocol FieldType: Sendable {
  29. // The Swift type used to store data for this field. For example,
  30. // proto "sint32" fields use Swift "Int32" type.
  31. associatedtype BaseType: Hashable, Sendable
  32. // The default value for this field type before it has been set.
  33. // This is also used, for example, when JSON decodes a "null"
  34. // value for a field.
  35. static var proto3DefaultValue: BaseType { get }
  36. // Generic reflector methods for looking up the correct
  37. // encoding/decoding for extension fields, map keys, and map
  38. // values.
  39. static func decodeSingular<D: Decoder>(value: inout BaseType?, from decoder: inout D) throws
  40. static func decodeRepeated<D: Decoder>(value: inout [BaseType], from decoder: inout D) throws
  41. static func visitSingular<V: Visitor>(value: BaseType, fieldNumber: Int, with visitor: inout V) throws
  42. static func visitRepeated<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws
  43. static func visitPacked<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws
  44. }
  45. ///
  46. /// Marker protocol for types that can be used as map keys
  47. ///
  48. @preconcurrency
  49. public protocol MapKeyType: FieldType {
  50. /// A comparison function for where order is needed. Can't use `Comparable`
  51. /// because `Bool` doesn't conform, and since it is `public` there is no way
  52. /// to add a conformance internal to SwiftProtobuf.
  53. static func _lessThan(lhs: BaseType, rhs: BaseType) -> Bool
  54. }
  55. // Default impl for anything `Comparable`
  56. extension MapKeyType where BaseType: Comparable {
  57. public static func _lessThan(lhs: BaseType, rhs: BaseType) -> Bool {
  58. lhs < rhs
  59. }
  60. }
  61. ///
  62. /// Marker Protocol for types that can be used as map values.
  63. ///
  64. @preconcurrency
  65. public protocol MapValueType: FieldType {
  66. }
  67. //
  68. // We have a struct for every basic proto field type which provides
  69. // serialization/deserialization support as static methods.
  70. //
  71. ///
  72. /// Float traits
  73. ///
  74. public struct ProtobufFloat: FieldType, MapValueType {
  75. public typealias BaseType = Float
  76. public static var proto3DefaultValue: Float { 0.0 }
  77. public static func decodeSingular<D: Decoder>(value: inout BaseType?, from decoder: inout D) throws {
  78. try decoder.decodeSingularFloatField(value: &value)
  79. }
  80. public static func decodeRepeated<D: Decoder>(value: inout [BaseType], from decoder: inout D) throws {
  81. try decoder.decodeRepeatedFloatField(value: &value)
  82. }
  83. public static func visitSingular<V: Visitor>(value: BaseType, fieldNumber: Int, with visitor: inout V) throws {
  84. try visitor.visitSingularFloatField(value: value, fieldNumber: fieldNumber)
  85. }
  86. public static func visitRepeated<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  87. try visitor.visitRepeatedFloatField(value: value, fieldNumber: fieldNumber)
  88. }
  89. public static func visitPacked<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  90. try visitor.visitPackedFloatField(value: value, fieldNumber: fieldNumber)
  91. }
  92. }
  93. ///
  94. /// Double
  95. ///
  96. public struct ProtobufDouble: FieldType, MapValueType {
  97. public typealias BaseType = Double
  98. public static var proto3DefaultValue: Double { 0.0 }
  99. public static func decodeSingular<D: Decoder>(value: inout BaseType?, from decoder: inout D) throws {
  100. try decoder.decodeSingularDoubleField(value: &value)
  101. }
  102. public static func decodeRepeated<D: Decoder>(value: inout [BaseType], from decoder: inout D) throws {
  103. try decoder.decodeRepeatedDoubleField(value: &value)
  104. }
  105. public static func visitSingular<V: Visitor>(value: BaseType, fieldNumber: Int, with visitor: inout V) throws {
  106. try visitor.visitSingularDoubleField(value: value, fieldNumber: fieldNumber)
  107. }
  108. public static func visitRepeated<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  109. try visitor.visitRepeatedDoubleField(value: value, fieldNumber: fieldNumber)
  110. }
  111. public static func visitPacked<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  112. try visitor.visitPackedDoubleField(value: value, fieldNumber: fieldNumber)
  113. }
  114. }
  115. ///
  116. /// Int32
  117. ///
  118. public struct ProtobufInt32: FieldType, MapKeyType, MapValueType {
  119. public typealias BaseType = Int32
  120. public static var proto3DefaultValue: Int32 { 0 }
  121. public static func decodeSingular<D: Decoder>(value: inout BaseType?, from decoder: inout D) throws {
  122. try decoder.decodeSingularInt32Field(value: &value)
  123. }
  124. public static func decodeRepeated<D: Decoder>(value: inout [BaseType], from decoder: inout D) throws {
  125. try decoder.decodeRepeatedInt32Field(value: &value)
  126. }
  127. public static func visitSingular<V: Visitor>(value: BaseType, fieldNumber: Int, with visitor: inout V) throws {
  128. try visitor.visitSingularInt32Field(value: value, fieldNumber: fieldNumber)
  129. }
  130. public static func visitRepeated<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  131. try visitor.visitRepeatedInt32Field(value: value, fieldNumber: fieldNumber)
  132. }
  133. public static func visitPacked<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  134. try visitor.visitPackedInt32Field(value: value, fieldNumber: fieldNumber)
  135. }
  136. }
  137. ///
  138. /// Int64
  139. ///
  140. public struct ProtobufInt64: FieldType, MapKeyType, MapValueType {
  141. public typealias BaseType = Int64
  142. public static var proto3DefaultValue: Int64 { 0 }
  143. public static func decodeSingular<D: Decoder>(value: inout BaseType?, from decoder: inout D) throws {
  144. try decoder.decodeSingularInt64Field(value: &value)
  145. }
  146. public static func decodeRepeated<D: Decoder>(value: inout [BaseType], from decoder: inout D) throws {
  147. try decoder.decodeRepeatedInt64Field(value: &value)
  148. }
  149. public static func visitSingular<V: Visitor>(value: BaseType, fieldNumber: Int, with visitor: inout V) throws {
  150. try visitor.visitSingularInt64Field(value: value, fieldNumber: fieldNumber)
  151. }
  152. public static func visitRepeated<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  153. try visitor.visitRepeatedInt64Field(value: value, fieldNumber: fieldNumber)
  154. }
  155. public static func visitPacked<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  156. try visitor.visitPackedInt64Field(value: value, fieldNumber: fieldNumber)
  157. }
  158. }
  159. ///
  160. /// UInt32
  161. ///
  162. public struct ProtobufUInt32: FieldType, MapKeyType, MapValueType {
  163. public typealias BaseType = UInt32
  164. public static var proto3DefaultValue: UInt32 { 0 }
  165. public static func decodeSingular<D: Decoder>(value: inout BaseType?, from decoder: inout D) throws {
  166. try decoder.decodeSingularUInt32Field(value: &value)
  167. }
  168. public static func decodeRepeated<D: Decoder>(value: inout [BaseType], from decoder: inout D) throws {
  169. try decoder.decodeRepeatedUInt32Field(value: &value)
  170. }
  171. public static func visitSingular<V: Visitor>(value: BaseType, fieldNumber: Int, with visitor: inout V) throws {
  172. try visitor.visitSingularUInt32Field(value: value, fieldNumber: fieldNumber)
  173. }
  174. public static func visitRepeated<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  175. try visitor.visitRepeatedUInt32Field(value: value, fieldNumber: fieldNumber)
  176. }
  177. public static func visitPacked<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  178. try visitor.visitPackedUInt32Field(value: value, fieldNumber: fieldNumber)
  179. }
  180. }
  181. ///
  182. /// UInt64
  183. ///
  184. public struct ProtobufUInt64: FieldType, MapKeyType, MapValueType {
  185. public typealias BaseType = UInt64
  186. public static var proto3DefaultValue: UInt64 { 0 }
  187. public static func decodeSingular<D: Decoder>(value: inout BaseType?, from decoder: inout D) throws {
  188. try decoder.decodeSingularUInt64Field(value: &value)
  189. }
  190. public static func decodeRepeated<D: Decoder>(value: inout [BaseType], from decoder: inout D) throws {
  191. try decoder.decodeRepeatedUInt64Field(value: &value)
  192. }
  193. public static func visitSingular<V: Visitor>(value: BaseType, fieldNumber: Int, with visitor: inout V) throws {
  194. try visitor.visitSingularUInt64Field(value: value, fieldNumber: fieldNumber)
  195. }
  196. public static func visitRepeated<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  197. try visitor.visitRepeatedUInt64Field(value: value, fieldNumber: fieldNumber)
  198. }
  199. public static func visitPacked<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  200. try visitor.visitPackedUInt64Field(value: value, fieldNumber: fieldNumber)
  201. }
  202. }
  203. ///
  204. /// SInt32
  205. ///
  206. public struct ProtobufSInt32: FieldType, MapKeyType, MapValueType {
  207. public typealias BaseType = Int32
  208. public static var proto3DefaultValue: Int32 { 0 }
  209. public static func decodeSingular<D: Decoder>(value: inout BaseType?, from decoder: inout D) throws {
  210. try decoder.decodeSingularSInt32Field(value: &value)
  211. }
  212. public static func decodeRepeated<D: Decoder>(value: inout [BaseType], from decoder: inout D) throws {
  213. try decoder.decodeRepeatedSInt32Field(value: &value)
  214. }
  215. public static func visitSingular<V: Visitor>(value: BaseType, fieldNumber: Int, with visitor: inout V) throws {
  216. try visitor.visitSingularSInt32Field(value: value, fieldNumber: fieldNumber)
  217. }
  218. public static func visitRepeated<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  219. try visitor.visitRepeatedSInt32Field(value: value, fieldNumber: fieldNumber)
  220. }
  221. public static func visitPacked<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  222. try visitor.visitPackedSInt32Field(value: value, fieldNumber: fieldNumber)
  223. }
  224. }
  225. ///
  226. /// SInt64
  227. ///
  228. public struct ProtobufSInt64: FieldType, MapKeyType, MapValueType {
  229. public typealias BaseType = Int64
  230. public static var proto3DefaultValue: Int64 { 0 }
  231. public static func decodeSingular<D: Decoder>(value: inout BaseType?, from decoder: inout D) throws {
  232. try decoder.decodeSingularSInt64Field(value: &value)
  233. }
  234. public static func decodeRepeated<D: Decoder>(value: inout [BaseType], from decoder: inout D) throws {
  235. try decoder.decodeRepeatedSInt64Field(value: &value)
  236. }
  237. public static func visitSingular<V: Visitor>(value: BaseType, fieldNumber: Int, with visitor: inout V) throws {
  238. try visitor.visitSingularSInt64Field(value: value, fieldNumber: fieldNumber)
  239. }
  240. public static func visitRepeated<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  241. try visitor.visitRepeatedSInt64Field(value: value, fieldNumber: fieldNumber)
  242. }
  243. public static func visitPacked<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  244. try visitor.visitPackedSInt64Field(value: value, fieldNumber: fieldNumber)
  245. }
  246. }
  247. ///
  248. /// Fixed32
  249. ///
  250. public struct ProtobufFixed32: FieldType, MapKeyType, MapValueType {
  251. public typealias BaseType = UInt32
  252. public static var proto3DefaultValue: UInt32 { 0 }
  253. public static func decodeSingular<D: Decoder>(value: inout BaseType?, from decoder: inout D) throws {
  254. try decoder.decodeSingularFixed32Field(value: &value)
  255. }
  256. public static func decodeRepeated<D: Decoder>(value: inout [BaseType], from decoder: inout D) throws {
  257. try decoder.decodeRepeatedFixed32Field(value: &value)
  258. }
  259. public static func visitSingular<V: Visitor>(value: BaseType, fieldNumber: Int, with visitor: inout V) throws {
  260. try visitor.visitSingularFixed32Field(value: value, fieldNumber: fieldNumber)
  261. }
  262. public static func visitRepeated<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  263. try visitor.visitRepeatedFixed32Field(value: value, fieldNumber: fieldNumber)
  264. }
  265. public static func visitPacked<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  266. try visitor.visitPackedFixed32Field(value: value, fieldNumber: fieldNumber)
  267. }
  268. }
  269. ///
  270. /// Fixed64
  271. ///
  272. public struct ProtobufFixed64: FieldType, MapKeyType, MapValueType {
  273. public typealias BaseType = UInt64
  274. public static var proto3DefaultValue: UInt64 { 0 }
  275. public static func decodeSingular<D: Decoder>(value: inout BaseType?, from decoder: inout D) throws {
  276. try decoder.decodeSingularFixed64Field(value: &value)
  277. }
  278. public static func decodeRepeated<D: Decoder>(value: inout [BaseType], from decoder: inout D) throws {
  279. try decoder.decodeRepeatedFixed64Field(value: &value)
  280. }
  281. public static func visitSingular<V: Visitor>(value: BaseType, fieldNumber: Int, with visitor: inout V) throws {
  282. try visitor.visitSingularFixed64Field(value: value, fieldNumber: fieldNumber)
  283. }
  284. public static func visitRepeated<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  285. try visitor.visitRepeatedFixed64Field(value: value, fieldNumber: fieldNumber)
  286. }
  287. public static func visitPacked<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  288. try visitor.visitPackedFixed64Field(value: value, fieldNumber: fieldNumber)
  289. }
  290. }
  291. ///
  292. /// SFixed32
  293. ///
  294. public struct ProtobufSFixed32: FieldType, MapKeyType, MapValueType {
  295. public typealias BaseType = Int32
  296. public static var proto3DefaultValue: Int32 { 0 }
  297. public static func decodeSingular<D: Decoder>(value: inout BaseType?, from decoder: inout D) throws {
  298. try decoder.decodeSingularSFixed32Field(value: &value)
  299. }
  300. public static func decodeRepeated<D: Decoder>(value: inout [BaseType], from decoder: inout D) throws {
  301. try decoder.decodeRepeatedSFixed32Field(value: &value)
  302. }
  303. public static func visitSingular<V: Visitor>(value: BaseType, fieldNumber: Int, with visitor: inout V) throws {
  304. try visitor.visitSingularSFixed32Field(value: value, fieldNumber: fieldNumber)
  305. }
  306. public static func visitRepeated<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  307. try visitor.visitRepeatedSFixed32Field(value: value, fieldNumber: fieldNumber)
  308. }
  309. public static func visitPacked<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  310. try visitor.visitPackedSFixed32Field(value: value, fieldNumber: fieldNumber)
  311. }
  312. }
  313. ///
  314. /// SFixed64
  315. ///
  316. public struct ProtobufSFixed64: FieldType, MapKeyType, MapValueType {
  317. public typealias BaseType = Int64
  318. public static var proto3DefaultValue: Int64 { 0 }
  319. public static func decodeSingular<D: Decoder>(value: inout BaseType?, from decoder: inout D) throws {
  320. try decoder.decodeSingularSFixed64Field(value: &value)
  321. }
  322. public static func decodeRepeated<D: Decoder>(value: inout [BaseType], from decoder: inout D) throws {
  323. try decoder.decodeRepeatedSFixed64Field(value: &value)
  324. }
  325. public static func visitSingular<V: Visitor>(value: BaseType, fieldNumber: Int, with visitor: inout V) throws {
  326. try visitor.visitSingularSFixed64Field(value: value, fieldNumber: fieldNumber)
  327. }
  328. public static func visitRepeated<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  329. try visitor.visitRepeatedSFixed64Field(value: value, fieldNumber: fieldNumber)
  330. }
  331. public static func visitPacked<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  332. try visitor.visitPackedSFixed64Field(value: value, fieldNumber: fieldNumber)
  333. }
  334. }
  335. ///
  336. /// Bool
  337. ///
  338. public struct ProtobufBool: FieldType, MapKeyType, MapValueType {
  339. public typealias BaseType = Bool
  340. public static var proto3DefaultValue: Bool { false }
  341. public static func decodeSingular<D: Decoder>(value: inout BaseType?, from decoder: inout D) throws {
  342. try decoder.decodeSingularBoolField(value: &value)
  343. }
  344. public static func decodeRepeated<D: Decoder>(value: inout [BaseType], from decoder: inout D) throws {
  345. try decoder.decodeRepeatedBoolField(value: &value)
  346. }
  347. public static func visitSingular<V: Visitor>(value: BaseType, fieldNumber: Int, with visitor: inout V) throws {
  348. try visitor.visitSingularBoolField(value: value, fieldNumber: fieldNumber)
  349. }
  350. public static func visitRepeated<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  351. try visitor.visitRepeatedBoolField(value: value, fieldNumber: fieldNumber)
  352. }
  353. public static func visitPacked<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  354. try visitor.visitPackedBoolField(value: value, fieldNumber: fieldNumber)
  355. }
  356. /// Custom _lessThan since `Bool` isn't `Comparable`.
  357. public static func _lessThan(lhs: BaseType, rhs: BaseType) -> Bool {
  358. if !lhs {
  359. return rhs
  360. }
  361. return false
  362. }
  363. }
  364. ///
  365. /// String
  366. ///
  367. public struct ProtobufString: FieldType, MapKeyType, MapValueType {
  368. public typealias BaseType = String
  369. public static var proto3DefaultValue: String { String() }
  370. public static func decodeSingular<D: Decoder>(value: inout BaseType?, from decoder: inout D) throws {
  371. try decoder.decodeSingularStringField(value: &value)
  372. }
  373. public static func decodeRepeated<D: Decoder>(value: inout [BaseType], from decoder: inout D) throws {
  374. try decoder.decodeRepeatedStringField(value: &value)
  375. }
  376. public static func visitSingular<V: Visitor>(value: BaseType, fieldNumber: Int, with visitor: inout V) throws {
  377. try visitor.visitSingularStringField(value: value, fieldNumber: fieldNumber)
  378. }
  379. public static func visitRepeated<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  380. try visitor.visitRepeatedStringField(value: value, fieldNumber: fieldNumber)
  381. }
  382. public static func visitPacked<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  383. assert(false)
  384. }
  385. }
  386. ///
  387. /// Bytes
  388. ///
  389. public struct ProtobufBytes: FieldType, MapValueType {
  390. public typealias BaseType = Data
  391. public static var proto3DefaultValue: Data { Data() }
  392. public static func decodeSingular<D: Decoder>(value: inout BaseType?, from decoder: inout D) throws {
  393. try decoder.decodeSingularBytesField(value: &value)
  394. }
  395. public static func decodeRepeated<D: Decoder>(value: inout [BaseType], from decoder: inout D) throws {
  396. try decoder.decodeRepeatedBytesField(value: &value)
  397. }
  398. public static func visitSingular<V: Visitor>(value: BaseType, fieldNumber: Int, with visitor: inout V) throws {
  399. try visitor.visitSingularBytesField(value: value, fieldNumber: fieldNumber)
  400. }
  401. public static func visitRepeated<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  402. try visitor.visitRepeatedBytesField(value: value, fieldNumber: fieldNumber)
  403. }
  404. public static func visitPacked<V: Visitor>(value: [BaseType], fieldNumber: Int, with visitor: inout V) throws {
  405. assert(false)
  406. }
  407. }