AnyCodableEquatable.swift 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. //
  2. // AnyCodableEquatable.swift
  3. // LoopKit
  4. //
  5. // Created by Darin Krauss on 2/8/22.
  6. // Copyright © 2022 LoopKit Authors. All rights reserved.
  7. //
  8. import Foundation
  9. public struct AnyCodableEquatable: Codable, Equatable {
  10. public enum Error: Swift.Error {
  11. case unknownType
  12. }
  13. public let wrapped: Any
  14. private let equals: (Self) -> Bool
  15. public init<T: Codable & Equatable>(_ wrapped: T) {
  16. self.wrapped = wrapped
  17. self.equals = { $0.wrapped as? T == wrapped }
  18. }
  19. public init(from decoder: Decoder) throws {
  20. let container = try decoder.singleValueContainer()
  21. if let value = try? container.decode(String.self) {
  22. self.init(value)
  23. } else if let value = try? container.decode(Int.self) {
  24. self.init(value)
  25. } else if let value = try? container.decode(Double.self) {
  26. self.init(value)
  27. } else if let value = try? container.decode(Bool.self) {
  28. self.init(value)
  29. } else {
  30. throw Error.unknownType
  31. }
  32. }
  33. public func encode(to encoder: Encoder) throws {
  34. try (wrapped as? Encodable)?.encode(to: encoder)
  35. }
  36. public static func ==(lhs: AnyCodableEquatable, rhs: AnyCodableEquatable) -> Bool {
  37. return lhs.equals(rhs)
  38. }
  39. }