99import Foundation
1010import HealthKit
1111
12+ struct WatchDatedRangeContext {
13+ public let startDate : Date
14+ public let endDate : Date
15+ public let minValue : Double
16+ public let maxValue : Double
17+
18+ public init ( startDate: Date , endDate: Date , minValue: Double , maxValue: Double ) {
19+ self . startDate = startDate
20+ self . endDate = endDate
21+ self . minValue = minValue
22+ self . maxValue = maxValue
23+ }
24+ }
25+
26+ struct WatchGlucoseContext {
27+ let value : Double
28+ let unit : HKUnit
29+ let startDate : Date
30+
31+ var quantity : HKQuantity {
32+ return HKQuantity ( unit: unit, doubleValue: value)
33+ }
34+ }
35+
36+ struct WatchPredictedGlucoseContext {
37+ let values : [ Double ]
38+ let unit : HKUnit
39+ let startDate : Date
40+ let interval : TimeInterval
41+
42+ var samples : [ WatchGlucoseContext ] {
43+ return values. enumerated ( ) . map { ( i, v) in
44+ WatchGlucoseContext ( value: v, unit: unit, startDate: startDate. addingTimeInterval ( Double ( i) * interval) )
45+ }
46+ }
47+ }
48+
49+ extension WatchDatedRangeContext : RawRepresentable {
50+ typealias RawValue = [ String : Any ]
51+
52+ var rawValue : RawValue {
53+ return [
54+ " sd " : startDate,
55+ " ed " : endDate,
56+ " mi " : minValue,
57+ " ma " : maxValue
58+ ]
59+ }
60+
61+ init ? ( rawValue: RawValue ) {
62+ guard
63+ let startDate = rawValue [ " sd " ] as? Date ,
64+ let endDate = rawValue [ " ed " ] as? Date ,
65+ let minValue = rawValue [ " mi " ] as? Double ,
66+ let maxValue = rawValue [ " ma " ] as? Double
67+ else {
68+ return nil
69+ }
70+
71+ self . startDate = startDate
72+ self . endDate = endDate
73+ self . minValue = minValue
74+ self . maxValue = maxValue
75+ }
76+ }
77+
78+ extension WatchGlucoseContext : RawRepresentable {
79+ typealias RawValue = [ String : Any ]
80+
81+ var rawValue : RawValue {
82+ return [
83+ " v " : value,
84+ " u " : unit. unitString,
85+ " sd " : startDate
86+ ]
87+ }
88+
89+ init ? ( rawValue: RawValue ) {
90+ guard
91+ let value = rawValue [ " v " ] as? Double ,
92+ let unitString = rawValue [ " u " ] as? String ,
93+ let startDate = rawValue [ " sd " ] as? Date
94+ else {
95+ return nil
96+ }
97+
98+ self . value = value
99+ self . unit = HKUnit ( from: unitString)
100+ self . startDate = startDate
101+ }
102+ }
103+
104+ extension WatchPredictedGlucoseContext : RawRepresentable {
105+ typealias RawValue = [ String : Any ]
106+
107+ var rawValue : RawValue {
108+ return [
109+ " v " : values,
110+ " u " : unit. unitString,
111+ " sd " : startDate,
112+ " i " : interval
113+ ]
114+ }
115+
116+ init ? ( rawValue: RawValue ) {
117+ guard
118+ let values = rawValue [ " v " ] as? [ Double ] ,
119+ let unitString = rawValue [ " u " ] as? String ,
120+ let startDate = rawValue [ " sd " ] as? Date ,
121+ let interval = rawValue [ " i " ] as? TimeInterval
122+ else {
123+ return nil
124+ }
125+
126+ self . values = values
127+ self . unit = HKUnit ( from: unitString)
128+ self . startDate = startDate
129+ self . interval = interval
130+ }
131+ }
132+
133+
12134final class WatchContext : NSObject , RawRepresentable {
13135 typealias RawValue = [ String : Any ]
14136
15- private let version = 3
137+ private let version = 4
16138
17139 var preferredGlucoseUnit : HKUnit ?
18140 var maxBolus : Double ?
@@ -22,6 +144,8 @@ final class WatchContext: NSObject, RawRepresentable {
22144 var eventualGlucose : HKQuantity ?
23145 var glucoseDate : Date ?
24146
147+ var targetRanges : [ WatchDatedRangeContext ] ?
148+ var temporaryOverride : WatchDatedRangeContext ?
25149 var glucoseRangeScheduleOverride : GlucoseRangeScheduleOverrideUserInfo ?
26150 var configuredOverrideContexts : [ GlucoseRangeScheduleOverrideUserInfo . Context ] = [ ]
27151
@@ -41,6 +165,7 @@ final class WatchContext: NSObject, RawRepresentable {
41165 var reservoir : Double ?
42166 var reservoirPercentage : Double ?
43167 var batteryPercentage : Double ?
168+ var predictedGlucose : WatchPredictedGlucoseContext ?
44169
45170 var cgm : CGM ?
46171
@@ -56,16 +181,15 @@ final class WatchContext: NSObject, RawRepresentable {
56181 }
57182
58183 if let unitString = rawValue [ " gu " ] as? String {
59- let unit = HKUnit ( from: unitString)
60- preferredGlucoseUnit = unit
184+ preferredGlucoseUnit = HKUnit ( from: unitString)
61185 }
62-
186+ let unit = preferredGlucoseUnit ?? . milligramsPerDeciliter
63187 if let glucoseValue = rawValue [ " gv " ] as? Double {
64- glucose = HKQuantity ( unit: preferredGlucoseUnit ?? . milligramsPerDeciliter , doubleValue: glucoseValue)
188+ glucose = HKQuantity ( unit: unit , doubleValue: glucoseValue)
65189 }
66190
67191 if let glucoseValue = rawValue [ " egv " ] as? Double {
68- eventualGlucose = HKQuantity ( unit: preferredGlucoseUnit ?? . milligramsPerDeciliter , doubleValue: glucoseValue)
192+ eventualGlucose = HKQuantity ( unit: unit , doubleValue: glucoseValue)
69193 }
70194
71195 glucoseTrendRawValue = rawValue [ " gt " ] as? Int
@@ -93,6 +217,18 @@ final class WatchContext: NSObject, RawRepresentable {
93217 COB = rawValue [ " cob " ] as? Double
94218 maxBolus = rawValue [ " mb " ] as? Double
95219
220+ if let rawValue = rawValue [ " pg " ] as? WatchPredictedGlucoseContext . RawValue {
221+ predictedGlucose = WatchPredictedGlucoseContext ( rawValue: rawValue)
222+ }
223+
224+ if let rawValue = rawValue [ " tr " ] as? [ WatchDatedRangeContext . RawValue ] {
225+ targetRanges = rawValue. compactMap ( { return WatchDatedRangeContext ( rawValue: $0) } )
226+ }
227+
228+ if let rawValue = rawValue [ " to " ] as? WatchDatedRangeContext . RawValue {
229+ temporaryOverride = WatchDatedRangeContext ( rawValue: rawValue)
230+ }
231+
96232 if let cgmRawValue = rawValue [ " cgm " ] as? CGM . RawValue {
97233 cgm = CGM ( rawValue: cgmRawValue)
98234 }
@@ -127,6 +263,11 @@ final class WatchContext: NSObject, RawRepresentable {
127263 raw [ " rbo " ] = recommendedBolusDose
128264 raw [ " rp " ] = reservoirPercentage
129265
266+ raw [ " pg " ] = predictedGlucose? . rawValue
267+
268+ raw [ " tr " ] = targetRanges? . map { $0. rawValue }
269+ raw [ " to " ] = temporaryOverride? . rawValue
270+
130271 return raw
131272 }
132273}
0 commit comments