diff --git a/CHANGELOG.md b/CHANGELOG.md index b0af83b..8d0a917 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## [1.7.1] - 27.06.2022. + +* Add raw keys for electrocardiogram classification and symptom status + +## [1.7.0] - 23.06.2022. + +* Make `averageHeartRate` optional as a `HKElectrocardiogram.Classification.inconclusivePoorReading` may not have a value for this field + ## [1.6.9] - 27.05.2022. * Add copyWith methods to Correlation diff --git a/HealthKitReporter.podspec b/HealthKitReporter.podspec index 8f45bc9..0292190 100644 --- a/HealthKitReporter.podspec +++ b/HealthKitReporter.podspec @@ -8,7 +8,7 @@ Pod::Spec.new do |s| s.name = 'HealthKitReporter' - s.version = '1.6.9' + s.version = '1.7.1' s.summary = 'HealthKitReporter. A wrapper for HealthKit framework.' s.swift_versions = '5.3' s.description = 'Helps to write or read data from Apple Health via HealthKit framework.' diff --git a/Package.swift b/Package.swift index 83e9573..ccda14d 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.2 +// swift-tools-version:5.3 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription diff --git a/Sources/Decorator/Extensions+HKElectrocardiogram.swift b/Sources/Decorator/Extensions+HKElectrocardiogram.swift index fe30f4e..477002f 100644 --- a/Sources/Decorator/Extensions+HKElectrocardiogram.swift +++ b/Sources/Decorator/Extensions+HKElectrocardiogram.swift @@ -13,13 +13,8 @@ extension HKElectrocardiogram { func harmonize(voltageMeasurements: [Electrocardiogram.VoltageMeasurement]) throws -> Harmonized { let averageHeartRateUnit = HKUnit.count().unitDivided(by: HKUnit.minute()) - guard - let averageHeartRate = averageHeartRate?.doubleValue(for: averageHeartRateUnit) - else { - throw HealthKitError.invalidValue( - "Invalid averageHeartRate value for HKElectrocardiogram" - ) - } + let averageHeartRate = averageHeartRate?.doubleValue(for: averageHeartRateUnit) + let samplingFrequencyUnit = HKUnit.hertz() guard let samplingFrequency = samplingFrequency?.doubleValue(for: samplingFrequencyUnit) @@ -34,7 +29,9 @@ extension HKElectrocardiogram { samplingFrequency: samplingFrequency, samplingFrequencyUnit: samplingFrequencyUnit.unitString, classification: classification.description, + classificationKey: classification.key, symptomsStatus: symptomsStatus.description, + symptomsStatusKey: symptomsStatus.key, count: numberOfVoltageMeasurements, voltageMeasurements: voltageMeasurements, metadata: metadata?.compactMapValues { String(describing: $0 )} @@ -62,6 +59,29 @@ extension HKElectrocardiogram.VoltageMeasurement: Harmonizable { // MARK: - CustomStringConvertible @available(iOS 14.0, *) extension HKElectrocardiogram.Classification: CustomStringConvertible { + public var key: String { + switch self { + case .notSet: + return "notSet" + case .sinusRhythm: + return "sinusRhythm" + case .atrialFibrillation: + return "atrialFibrillation" + case .inconclusiveLowHeartRate: + return "inconclusiveLowHeartRate" + case .inconclusiveHighHeartRate: + return "inconclusiveHighHeartRate" + case .inconclusivePoorReading: + return "inconclusivePoorReading" + case .inconclusiveOther: + return "inconclusiveOther" + case .unrecognized: + return "unrecognized" + @unknown default: + fatalError() + } + } + public var description: String { switch self { case .notSet: @@ -88,6 +108,18 @@ extension HKElectrocardiogram.Classification: CustomStringConvertible { // MARK: - CustomStringConvertible @available(iOS 14.0, *) extension HKElectrocardiogram.SymptomsStatus: CustomStringConvertible { + public var key: String { + switch self { + case .notSet: + return "notSet" + case .none: + return "none" + case .present: + return "present" + @unknown default: + fatalError() + } + } public var description: String { switch self { case .notSet: diff --git a/Sources/Model/Payload/Electrocardiogram.swift b/Sources/Model/Payload/Electrocardiogram.swift index f5ed6b9..b1ce324 100644 --- a/Sources/Model/Payload/Electrocardiogram.swift +++ b/Sources/Model/Payload/Electrocardiogram.swift @@ -10,23 +10,27 @@ import HealthKit @available(iOS 14.0, *) public struct Electrocardiogram: Identifiable, Sample { public struct Harmonized: Codable { - public let averageHeartRate: Double + public let averageHeartRate: Double? public let averageHeartRateUnit: String public let samplingFrequency: Double public let samplingFrequencyUnit: String public let classification: String + public let classificationKey: String public let symptomsStatus: String + public let symptomsStatusKey: String public let count: Int public let voltageMeasurements: [VoltageMeasurement] public let metadata: [String: String]? init( - averageHeartRate: Double, + averageHeartRate: Double?, averageHeartRateUnit: String, samplingFrequency: Double, samplingFrequencyUnit: String, classification: String, + classificationKey: String, symptomsStatus: String, + symptomsStatusKey: String, count: Int, voltageMeasurements: [VoltageMeasurement], metadata: [String: String]? @@ -36,7 +40,9 @@ public struct Electrocardiogram: Identifiable, Sample { self.samplingFrequency = samplingFrequency self.samplingFrequencyUnit = samplingFrequencyUnit self.classification = classification + self.classificationKey = classificationKey self.symptomsStatus = symptomsStatus + self.symptomsStatusKey = symptomsStatusKey self.count = count self.voltageMeasurements = voltageMeasurements self.metadata = metadata @@ -117,7 +123,9 @@ extension Electrocardiogram.Harmonized: Payload { let samplingFrequency = dictionary["samplingFrequency"] as? NSNumber, let samplingFrequencyUnit = dictionary["samplingFrequencyUnit"] as? String, let classification = dictionary["classification"] as? String, + let classificationKey = dictionary["classificationKey"] as? String, let symptomsStatus = dictionary["symptomsStatus"] as? String, + let symptomsStatusKey = dictionary["symptomsStatusKey"] as? String, let count = dictionary["count"] as? Int else { throw HealthKitError.invalidValue("Invalid dictionary: \(dictionary)") @@ -130,7 +138,9 @@ extension Electrocardiogram.Harmonized: Payload { samplingFrequency: Double(truncating: samplingFrequency), samplingFrequencyUnit: samplingFrequencyUnit, classification: classification, + classificationKey: classificationKey, symptomsStatus: symptomsStatus, + symptomsStatusKey: symptomsStatusKey, count: count, voltageMeasurements: voltageMeasurements != nil ? try Electrocardiogram.VoltageMeasurement.collect(from: voltageMeasurements!)