CorrectionRangeOverrides.swift 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. //
  2. // CorrectionRangeOverrides.swift
  3. // LoopKit
  4. //
  5. // Created by Rick Pasetto on 7/14/20.
  6. // Copyright © 2020 LoopKit Authors. All rights reserved.
  7. //
  8. import HealthKit
  9. import Foundation
  10. public struct CorrectionRangeOverrides: Equatable {
  11. public enum Preset: Hashable, CaseIterable {
  12. case preMeal
  13. case workout
  14. }
  15. public var ranges: [Preset: ClosedRange<HKQuantity>]
  16. public init(preMeal: DoubleRange?, workout: DoubleRange?, unit: HKUnit) {
  17. ranges = [:]
  18. ranges[.preMeal] = preMeal?.quantityRange(for: unit)
  19. ranges[.workout] = workout?.quantityRange(for: unit)
  20. }
  21. public init(preMeal: GlucoseRange?, workout: GlucoseRange?) {
  22. ranges = [:]
  23. ranges[.preMeal] = preMeal?.quantityRange
  24. ranges[.workout] = workout?.quantityRange
  25. }
  26. public init(preMeal: ClosedRange<HKQuantity>?, workout: ClosedRange<HKQuantity>?) {
  27. ranges = [:]
  28. ranges[.preMeal] = preMeal
  29. ranges[.workout] = workout
  30. }
  31. public var preMeal: ClosedRange<HKQuantity>? { ranges[.preMeal] }
  32. public var workout: ClosedRange<HKQuantity>? { ranges[.workout] }
  33. }
  34. public extension CorrectionRangeOverrides.Preset {
  35. var title: String {
  36. switch self {
  37. case .preMeal:
  38. return LocalizedString("Pre-Meal", comment: "Title for pre-meal mode")
  39. case .workout:
  40. return LocalizedString("Workout", comment: "Title for workout mode")
  41. }
  42. }
  43. var therapySetting: TherapySetting {
  44. switch self {
  45. case .preMeal: return .preMealCorrectionRangeOverride
  46. case .workout: return .workoutCorrectionRangeOverride
  47. }
  48. }
  49. }
  50. extension CorrectionRangeOverrides: Codable {
  51. fileprivate var codingGlucoseUnit: HKUnit {
  52. return .milligramsPerDeciliter
  53. }
  54. public init(from decoder: Decoder) throws {
  55. let container = try decoder.container(keyedBy: CodingKeys.self)
  56. let preMealGlucoseRange = try container.decodeIfPresent(GlucoseRange.self, forKey: .preMealRange)
  57. let workoutGlucoseRange = try container.decodeIfPresent(GlucoseRange.self, forKey: .workoutRange)
  58. self.ranges = [:]
  59. self.ranges[.preMeal] = preMealGlucoseRange?.quantityRange
  60. self.ranges[.workout] = workoutGlucoseRange?.quantityRange
  61. }
  62. public func encode(to encoder: Encoder) throws {
  63. var container = encoder.container(keyedBy: CodingKeys.self)
  64. let preMealGlucoseRange = preMeal?.glucoseRange(for: codingGlucoseUnit)
  65. let workoutGlucoseRange = workout?.glucoseRange(for: codingGlucoseUnit)
  66. try container.encodeIfPresent(preMealGlucoseRange, forKey: .preMealRange)
  67. try container.encodeIfPresent(workoutGlucoseRange, forKey: .workoutRange)
  68. }
  69. private enum CodingKeys: String, CodingKey {
  70. case preMealRange
  71. case workoutRange
  72. case bloodGlucoseUnit
  73. }
  74. }
  75. extension CorrectionRangeOverrides: RawRepresentable {
  76. public typealias RawValue = [String: Any]
  77. public init?(rawValue: RawValue) {
  78. ranges = [:]
  79. if let rawPreMealTargetRange = rawValue["preMealTargetRange"] as? GlucoseRange.RawValue {
  80. ranges[.preMeal] = GlucoseRange(rawValue: rawPreMealTargetRange)?.quantityRange
  81. }
  82. if let rawWorkoutTargetRange = rawValue["workoutTargetRange"] as? GlucoseRange.RawValue {
  83. ranges[.workout] = GlucoseRange(rawValue: rawWorkoutTargetRange)?.quantityRange
  84. }
  85. }
  86. public var rawValue: RawValue {
  87. var raw: RawValue = [:]
  88. let preMealTargetGlucoseRange = preMeal?.glucoseRange(for: codingGlucoseUnit)
  89. let workoutTargetGlucoseRange = workout?.glucoseRange(for: codingGlucoseUnit)
  90. raw["preMealTargetRange"] = preMealTargetGlucoseRange?.rawValue
  91. raw["workoutTargetRange"] = workoutTargetGlucoseRange?.rawValue
  92. return raw
  93. }
  94. }