StoredFavoriteFood.swift 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. //
  2. // StoredFavoriteFood.swift
  3. // LoopKit
  4. //
  5. // Created by Noah Brauner on 8/9/23.
  6. // Copyright © 2023 LoopKit Authors. All rights reserved.
  7. //
  8. import HealthKit
  9. public struct StoredFavoriteFood: FavoriteFood, Identifiable {
  10. public var id: String
  11. public var name: String
  12. public var carbsQuantity: HKQuantity
  13. public var foodType: String
  14. public var absorptionTime: TimeInterval
  15. public init(id: String = UUID().uuidString, name: String, carbsQuantity: HKQuantity, foodType: String, absorptionTime: TimeInterval) {
  16. self.id = id
  17. self.name = name
  18. self.carbsQuantity = carbsQuantity
  19. self.foodType = foodType
  20. self.absorptionTime = absorptionTime
  21. }
  22. }
  23. extension StoredFavoriteFood: Equatable {
  24. public static func == (lhs: StoredFavoriteFood, rhs: StoredFavoriteFood) -> Bool {
  25. return lhs.id == rhs.id
  26. }
  27. }
  28. extension StoredFavoriteFood: Codable {
  29. public init(from decoder: Decoder) throws {
  30. let container = try decoder.container(keyedBy: CodingKeys.self)
  31. self.init(
  32. id: try container.decode(String.self, forKey: .id),
  33. name: try container.decode(String.self, forKey: .name),
  34. carbsQuantity: HKQuantity(unit: .gram(), doubleValue: try container.decode(Double.self, forKey: .carbsQuantity)),
  35. foodType: try container.decode(String.self, forKey: .foodType),
  36. absorptionTime: try container.decode(TimeInterval.self, forKey: .absorptionTime)
  37. )
  38. }
  39. public func encode(to encoder: Encoder) throws {
  40. var container = encoder.container(keyedBy: CodingKeys.self)
  41. try container.encode(id, forKey: .id)
  42. try container.encode(name, forKey: .name)
  43. try container.encode(carbsQuantity.doubleValue(for: .gram()), forKey: .carbsQuantity)
  44. try container.encode(foodType, forKey: .foodType)
  45. try container.encode(absorptionTime, forKey: .absorptionTime)
  46. }
  47. private enum CodingKeys: String, CodingKey {
  48. case id
  49. case name
  50. case carbsQuantity
  51. case foodType
  52. case absorptionTime
  53. }
  54. }