@@ -10,48 +10,70 @@ import Foundation
1010import HealthKit
1111import LoopKit
1212
13-
1413struct 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 ]
2215}
2316
24-
2517extension WatchHistoricalGlucose : RawRepresentable {
2618 typealias RawValue = [ String : Any ]
2719
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+
2828 var rawValue : RawValue {
29+ guard let rawSamples = try ? Self . encoder. encode ( Flattened ( samples: samples) ) else {
30+ return [ : ]
31+ }
2932 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
3534 ]
3635 }
3736
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 }
5156 }
5257
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+ }
5569 }
5670 }
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 ( )
5779}
0 commit comments