@@ -10,48 +10,70 @@ import Foundation
10
10
import HealthKit
11
11
import LoopKit
12
12
13
-
14
13
struct WatchHistoricalGlucose {
15
- let samples : [ NewGlucoseSample ]
16
-
17
- init ( with samples: [ StoredGlucoseSample ] ) {
18
- self . samples = samples. map {
19
- NewGlucoseSample ( date: $0. startDate, quantity: $0. quantity, isDisplayOnly: $0. isDisplayOnly, wasUserEntered: $0. wasUserEntered, syncIdentifier: $0. syncIdentifier, syncVersion: 0 )
20
- }
21
- }
14
+ let samples : [ StoredGlucoseSample ]
22
15
}
23
16
24
-
25
17
extension WatchHistoricalGlucose : RawRepresentable {
26
18
typealias RawValue = [ String : Any ]
27
19
20
+ init ? ( rawValue: RawValue ) {
21
+ guard let rawSamples = rawValue [ " samples " ] as? Data ,
22
+ let flattened = try ? Self . decoder. decode ( Flattened . self, from: rawSamples) else {
23
+ return nil
24
+ }
25
+ self . samples = flattened. samples
26
+ }
27
+
28
28
var rawValue : RawValue {
29
+ guard let rawSamples = try ? Self . encoder. encode ( Flattened ( samples: samples) ) else {
30
+ return [ : ]
31
+ }
29
32
return [
30
- " d " : samples. map { $0. date } ,
31
- " v " : samples. map { Int16 ( $0. quantity. doubleValue ( for: . milligramsPerDeciliter) ) } ,
32
- " id " : samples. map { $0. syncIdentifier } ,
33
- " do " : samples. map { $0. isDisplayOnly } ,
34
- " ue " : samples. map { $0. wasUserEntered }
33
+ " samples " : rawSamples
35
34
]
36
35
}
37
36
38
- init ? ( rawValue: RawValue ) {
39
- guard
40
- let dates = rawValue [ " d " ] as? [ Date ] ,
41
- let values = rawValue [ " v " ] as? [ Int16 ] ,
42
- let syncIdentifiers = rawValue [ " id " ] as? [ String ] ,
43
- let isDisplayOnly = rawValue [ " do " ] as? [ Bool ] ,
44
- let wasUserEntered = rawValue [ " ue " ] as? [ Bool ] ,
45
- dates. count == values. count,
46
- dates. count == syncIdentifiers. count,
47
- dates. count == isDisplayOnly. count,
48
- dates. count == wasUserEntered. count
49
- else {
50
- return nil
37
+ private struct Flattened : Codable {
38
+ let uuids : [ UUID ? ]
39
+ let provenanceIdentifiers : [ String ]
40
+ let syncIdentifiers : [ String ? ]
41
+ let syncVersions : [ Int ? ]
42
+ let startDates : [ Date ]
43
+ let quantities : [ Double ]
44
+ let isDisplayOnlys : [ Bool ]
45
+ let wasUserEntereds : [ Bool ]
46
+
47
+ init ( samples: [ StoredGlucoseSample ] ) {
48
+ self . uuids = samples. map { $0. uuid }
49
+ self . provenanceIdentifiers = samples. map { $0. provenanceIdentifier }
50
+ self . syncIdentifiers = samples. map { $0. syncIdentifier }
51
+ self . syncVersions = samples. map { $0. syncVersion }
52
+ self . startDates = samples. map { $0. startDate }
53
+ self . quantities = samples. map { $0. quantity. doubleValue ( for: . milligramsPerDeciliter) }
54
+ self . isDisplayOnlys = samples. map { $0. isDisplayOnly }
55
+ self . wasUserEntereds = samples. map { $0. wasUserEntered }
51
56
}
52
57
53
- self . samples = ( 0 ..< dates. count) . map {
54
- NewGlucoseSample ( date: dates [ $0] , quantity: HKQuantity ( unit: . milligramsPerDeciliter, doubleValue: Double ( values [ $0] ) ) , isDisplayOnly: isDisplayOnly [ $0] , wasUserEntered: wasUserEntered [ $0] , syncIdentifier: syncIdentifiers [ $0] , syncVersion: 0 )
58
+ var samples : [ StoredGlucoseSample ] {
59
+ return ( 0 ..< uuids. count) . map {
60
+ StoredGlucoseSample ( uuid: uuids [ $0] ,
61
+ provenanceIdentifier: provenanceIdentifiers [ $0] ,
62
+ syncIdentifier: syncIdentifiers [ $0] ,
63
+ syncVersion: syncVersions [ $0] ,
64
+ startDate: startDates [ $0] ,
65
+ quantity: HKQuantity ( unit: . milligramsPerDeciliter, doubleValue: quantities [ $0] ) ,
66
+ isDisplayOnly: isDisplayOnlys [ $0] ,
67
+ wasUserEntered: wasUserEntereds [ $0] )
68
+ }
55
69
}
56
70
}
71
+
72
+ private static var encoder : PropertyListEncoder {
73
+ let encoder = PropertyListEncoder ( )
74
+ encoder. outputFormat = . binary
75
+ return encoder
76
+ }
77
+
78
+ private static var decoder : PropertyListDecoder = PropertyListDecoder ( )
57
79
}
0 commit comments