ComputedInsulinSensitivities.swift 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import Foundation
  2. struct ComputedInsulinSensitivities: Codable {
  3. let units: GlucoseUnits
  4. let userPreferredUnits: GlucoseUnits
  5. let sensitivities: [ComputedInsulinSensitivityEntry]
  6. func toInsulinSensitivities() -> InsulinSensitivities {
  7. let sensitivities = self.sensitivities
  8. .map { InsulinSensitivityEntry(sensitivity: $0.sensitivity, offset: $0.offset, start: $0.start) }
  9. return InsulinSensitivities(units: units, userPreferredUnits: userPreferredUnits, sensitivities: sensitivities)
  10. }
  11. }
  12. extension ComputedInsulinSensitivities {
  13. private enum CodingKeys: String, CodingKey {
  14. case units
  15. case userPreferredUnits = "user_preferred_units"
  16. case sensitivities
  17. }
  18. }
  19. struct ComputedInsulinSensitivityEntry: Codable {
  20. let sensitivity: Decimal
  21. let offset: Int
  22. let start: String
  23. var endOffset: Int?
  24. let id: UUID // we use this to help with mutating inputs, we don't serialize it
  25. init(sensitivity: Decimal, offset: Int, start: String, endOffset: Int? = nil, id: UUID? = nil) {
  26. self.sensitivity = sensitivity
  27. self.offset = offset
  28. self.start = start
  29. self.endOffset = endOffset
  30. self.id = id ?? UUID()
  31. }
  32. enum CodingKeys: CodingKey {
  33. case sensitivity
  34. case offset
  35. case start
  36. case endOffset
  37. }
  38. func encode(to encoder: Encoder) throws {
  39. var container = encoder.container(keyedBy: CodingKeys.self)
  40. try container.encode(sensitivity, forKey: .sensitivity)
  41. try container.encode(offset, forKey: .offset)
  42. try container.encode(start, forKey: .start)
  43. try container.encodeIfPresent(endOffset, forKey: .endOffset)
  44. }
  45. init(from decoder: Decoder) throws {
  46. let container = try decoder.container(keyedBy: CodingKeys.self)
  47. sensitivity = try container.decode(Decimal.self, forKey: .sensitivity)
  48. offset = try container.decode(Int.self, forKey: .offset)
  49. start = try container.decode(String.self, forKey: .start)
  50. endOffset = try container.decodeIfPresent(Int.self, forKey: .endOffset)
  51. id = UUID()
  52. }
  53. }