Timestamp+Codable.swift 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /*
  2. * Copyright 2019 Google
  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. @_exported import class FirebaseCore.Timestamp
  17. /**
  18. * A protocol describing the encodable properties of a Timestamp.
  19. *
  20. * Note: this protocol exists as a workaround for the Swift compiler: if the Timestamp class
  21. * was extended directly to conform to Codable, the methods implementing the protocol would be need
  22. * to be marked required but that can't be done in an extension. Declaring the extension on the
  23. * protocol sidesteps this issue.
  24. */
  25. private protocol CodableTimestamp: Codable {
  26. var seconds: Int64 { get }
  27. var nanoseconds: Int32 { get }
  28. init(seconds: Int64, nanoseconds: Int32)
  29. }
  30. /** The keys in a Timestamp. Must match the properties of CodableTimestamp. */
  31. private enum TimestampKeys: String, CodingKey {
  32. case seconds
  33. case nanoseconds
  34. }
  35. /**
  36. * An extension of Timestamp that implements the behavior of the Codable protocol.
  37. *
  38. * Note: this is implemented manually here because the Swift compiler can't synthesize these methods
  39. * when declaring an extension to conform to Codable.
  40. */
  41. extension CodableTimestamp {
  42. public init(from decoder: Decoder) throws {
  43. let container = try decoder.container(keyedBy: TimestampKeys.self)
  44. let seconds = try container.decode(Int64.self, forKey: .seconds)
  45. let nanoseconds = try container.decode(Int32.self, forKey: .nanoseconds)
  46. self.init(seconds: seconds, nanoseconds: nanoseconds)
  47. }
  48. public func encode(to encoder: Encoder) throws {
  49. var container = encoder.container(keyedBy: TimestampKeys.self)
  50. try container.encode(seconds, forKey: .seconds)
  51. try container.encode(nanoseconds, forKey: .nanoseconds)
  52. }
  53. }
  54. /** Extends Timestamp to conform to Codable. */
  55. extension FirebaseCore.Timestamp: FirebaseFirestore.CodableTimestamp {}