From 0cad71bb58a868c8a052e849d366b75ea7a4fb29 Mon Sep 17 00:00:00 2001 From: Arwain Date: Thu, 17 Aug 2023 09:38:24 -1000 Subject: [PATCH 1/3] Add replaceComponent and subtypes to PumpEventType --- LoopKit/InsulinKit/DoseType.swift | 2 +- LoopKit/InsulinKit/NewPumpEvent.swift | 42 ++++++++++++ LoopKit/InsulinKit/PumpEventType.swift | 91 ++++++++++++++++++++++---- 3 files changed, 123 insertions(+), 12 deletions(-) diff --git a/LoopKit/InsulinKit/DoseType.swift b/LoopKit/InsulinKit/DoseType.swift index 3c6a83f48..e36258e06 100644 --- a/LoopKit/InsulinKit/DoseType.swift +++ b/LoopKit/InsulinKit/DoseType.swift @@ -48,7 +48,7 @@ extension DoseType { self = .suspend case .tempBasal: self = .tempBasal - case .alarm, .alarmClear, .prime, .rewind: + case .alarm, .alarmClear, .prime, .rewind, .replaceComponent(.reservoir), .replaceComponent(.pump), .replaceComponent(.infusionSet): return nil } } diff --git a/LoopKit/InsulinKit/NewPumpEvent.swift b/LoopKit/InsulinKit/NewPumpEvent.swift index 0fca3378a..b2fcf8e2c 100644 --- a/LoopKit/InsulinKit/NewPumpEvent.swift +++ b/LoopKit/InsulinKit/NewPumpEvent.swift @@ -10,6 +10,48 @@ import Foundation public struct NewPumpEvent: Equatable { + public static func == (lhs: NewPumpEvent, rhs: NewPumpEvent) -> Bool { + switch (lhs.type, rhs.type) { + case (.alarm, .alarm): + return true + case (.alarmClear, .alarmClear): + return true + case (.basal, .basal): + if rhs.date == rhs.date && lhs.dose == rhs.dose { + return true + } else { + return false + } + case (.bolus, .bolus): + if rhs.date == rhs.date && lhs.dose == rhs.dose { + return true + } else { + return false + } + case (.prime, .prime): + return true + case (.resume, .resume): + return true + case (.rewind, .rewind): + return true + case (.suspend, .suspend): + return true + case (.tempBasal, .tempBasal): + if rhs.date == rhs.date && lhs.dose == rhs.dose { + return true + } else { + return false + } + case (.replaceComponent(.reservoir), .replaceComponent(.reservoir)): + return true + case (.replaceComponent(.pump), .replaceComponent(.pump)): + return true + case (.replaceComponent(.infusionSet), .replaceComponent(.infusionSet)): + return true + default: + return false + } + } /// The date of the event public let date: Date /// The insulin dose described by the event, if applicable diff --git a/LoopKit/InsulinKit/PumpEventType.swift b/LoopKit/InsulinKit/PumpEventType.swift index 80138b3ed..9c5bf9966 100644 --- a/LoopKit/InsulinKit/PumpEventType.swift +++ b/LoopKit/InsulinKit/PumpEventType.swift @@ -9,19 +9,82 @@ import Foundation -/// A subset of pump event types, with raw values matching decocare's strings -public enum PumpEventType: String, CaseIterable { - case alarm = "AlarmPump" - case alarmClear = "ClearAlarm" - case basal = "BasalProfileStart" - case bolus = "Bolus" - case prime = "Prime" - case resume = "PumpResume" - case rewind = "Rewind" - case suspend = "PumpSuspend" - case tempBasal = "TempBasal" +/// A subset of pump event types +public enum PumpEventType { + typealias RawValue = String + + case alarm + case alarmClear + case basal + case bolus + case prime + case resume + case rewind + case suspend + case tempBasal + case replaceComponent(componentType: ReplaceableComponent) + + init?(rawValue: String) { + switch rawValue { + case "AlarmPump": + self = .alarm + case "ClearAlarm": + self = .alarmClear + case "BasalProfileStart": + self = .basal + case "Bolus": + self = .bolus + case "Prime": + self = .prime + case "PumpResume": + self = .resume + case "Rewind": + self = .rewind + case "PumpSuspend": + self = .suspend + case "TempBasal": + self = .tempBasal + default: + if rawValue.starts(with: "Replace"), let value = ReplaceableComponent(rawValue: String(rawValue.dropFirst(7))) { + self = .replaceComponent(componentType: value) + } else { + return nil + } + } + } + + var rawValue: String { + switch self { + case .alarm: + return "AlarmPump" + case .alarmClear: + return "ClearAlarm" + case .basal: + return "BasalProfileStart" + case .bolus: + return "Bolus" + case .prime: + return "Prime" + case .resume: + return "PumpResume" + case .rewind: + return "Rewind" + case .suspend: + return "PumpSuspend" + case .tempBasal: + return "TempBasal" + case let .replaceComponent(componentType): + return "Replace\(componentType.rawValue)" + } + } } +/// A subset of replaceable component types +public enum ReplaceableComponent: String { + case reservoir + case pump // base/ pod/ patch + case infusionSet +} extension PumpEventType { /// Provides an ordering between types used for stable, chronological sorting for doses that share the same date. @@ -50,6 +113,12 @@ extension PumpEventType { return 8 case .basal: return 9 + case .replaceComponent(componentType: .reservoir): + return 4 + case .replaceComponent(componentType: .pump): + return 4 + case .replaceComponent(componentType: .infusionSet): + return 4 } } } From 139ea71454ce30580054f71fc498d8ab19fefb25 Mon Sep 17 00:00:00 2001 From: Arwain Date: Thu, 17 Aug 2023 16:16:15 -1000 Subject: [PATCH 2/3] Enable CaseIterable and Equatable for test cases --- LoopKit/InsulinKit/PumpEventType.swift | 37 +++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/LoopKit/InsulinKit/PumpEventType.swift b/LoopKit/InsulinKit/PumpEventType.swift index 9c5bf9966..a419002d3 100644 --- a/LoopKit/InsulinKit/PumpEventType.swift +++ b/LoopKit/InsulinKit/PumpEventType.swift @@ -10,7 +10,7 @@ import Foundation /// A subset of pump event types -public enum PumpEventType { +public enum PumpEventType: CaseIterable, Equatable { typealias RawValue = String case alarm @@ -77,6 +77,41 @@ public enum PumpEventType { return "Replace\(componentType.rawValue)" } } + + public static var allCases: [PumpEventType] { + return [.alarm, .alarmClear, .basal, .bolus, .prime, .resume, .rewind, .suspend, .tempBasal, .replaceComponent(componentType: .reservoir), .replaceComponent(componentType: .pump), .replaceComponent(componentType: .infusionSet)] + } + + public static func == (lhs: PumpEventType, rhs: PumpEventType) -> Bool { + switch (lhs, rhs) { + case (.alarm, .alarm): + return true + case (.alarmClear, .alarmClear): + return true + case (.basal, .basal): + return true + case (.bolus, .bolus): + return true + case (.prime, .prime): + return true + case (.resume, .resume): + return true + case (.rewind, .rewind): + return true + case (.suspend, .suspend): + return true + case (.tempBasal, .tempBasal): + return true + case (.replaceComponent(.reservoir), .replaceComponent(.reservoir)): + return true + case (.replaceComponent(.pump), .replaceComponent(.pump)): + return true + case (.replaceComponent(.infusionSet), .replaceComponent(.infusionSet)): + return true + default: + return false + } + } } /// A subset of replaceable component types From e0cbf0e6b0f698e8ed914d1364db94438e88f5ae Mon Sep 17 00:00:00 2001 From: Arwain Date: Fri, 18 Aug 2023 11:30:32 -1000 Subject: [PATCH 3/3] Remove explicit equatable definition and condense DoseType case --- LoopKit/InsulinKit/DoseType.swift | 2 +- LoopKit/InsulinKit/NewPumpEvent.swift | 42 -------------------------- LoopKit/InsulinKit/PumpEventType.swift | 39 +++--------------------- 3 files changed, 5 insertions(+), 78 deletions(-) diff --git a/LoopKit/InsulinKit/DoseType.swift b/LoopKit/InsulinKit/DoseType.swift index e36258e06..0ce73d987 100644 --- a/LoopKit/InsulinKit/DoseType.swift +++ b/LoopKit/InsulinKit/DoseType.swift @@ -48,7 +48,7 @@ extension DoseType { self = .suspend case .tempBasal: self = .tempBasal - case .alarm, .alarmClear, .prime, .rewind, .replaceComponent(.reservoir), .replaceComponent(.pump), .replaceComponent(.infusionSet): + case .alarm, .alarmClear, .prime, .rewind, .replaceComponent: return nil } } diff --git a/LoopKit/InsulinKit/NewPumpEvent.swift b/LoopKit/InsulinKit/NewPumpEvent.swift index b2fcf8e2c..0fca3378a 100644 --- a/LoopKit/InsulinKit/NewPumpEvent.swift +++ b/LoopKit/InsulinKit/NewPumpEvent.swift @@ -10,48 +10,6 @@ import Foundation public struct NewPumpEvent: Equatable { - public static func == (lhs: NewPumpEvent, rhs: NewPumpEvent) -> Bool { - switch (lhs.type, rhs.type) { - case (.alarm, .alarm): - return true - case (.alarmClear, .alarmClear): - return true - case (.basal, .basal): - if rhs.date == rhs.date && lhs.dose == rhs.dose { - return true - } else { - return false - } - case (.bolus, .bolus): - if rhs.date == rhs.date && lhs.dose == rhs.dose { - return true - } else { - return false - } - case (.prime, .prime): - return true - case (.resume, .resume): - return true - case (.rewind, .rewind): - return true - case (.suspend, .suspend): - return true - case (.tempBasal, .tempBasal): - if rhs.date == rhs.date && lhs.dose == rhs.dose { - return true - } else { - return false - } - case (.replaceComponent(.reservoir), .replaceComponent(.reservoir)): - return true - case (.replaceComponent(.pump), .replaceComponent(.pump)): - return true - case (.replaceComponent(.infusionSet), .replaceComponent(.infusionSet)): - return true - default: - return false - } - } /// The date of the event public let date: Date /// The insulin dose described by the event, if applicable diff --git a/LoopKit/InsulinKit/PumpEventType.swift b/LoopKit/InsulinKit/PumpEventType.swift index a419002d3..e058732ae 100644 --- a/LoopKit/InsulinKit/PumpEventType.swift +++ b/LoopKit/InsulinKit/PumpEventType.swift @@ -81,43 +81,12 @@ public enum PumpEventType: CaseIterable, Equatable { public static var allCases: [PumpEventType] { return [.alarm, .alarmClear, .basal, .bolus, .prime, .resume, .rewind, .suspend, .tempBasal, .replaceComponent(componentType: .reservoir), .replaceComponent(componentType: .pump), .replaceComponent(componentType: .infusionSet)] } - - public static func == (lhs: PumpEventType, rhs: PumpEventType) -> Bool { - switch (lhs, rhs) { - case (.alarm, .alarm): - return true - case (.alarmClear, .alarmClear): - return true - case (.basal, .basal): - return true - case (.bolus, .bolus): - return true - case (.prime, .prime): - return true - case (.resume, .resume): - return true - case (.rewind, .rewind): - return true - case (.suspend, .suspend): - return true - case (.tempBasal, .tempBasal): - return true - case (.replaceComponent(.reservoir), .replaceComponent(.reservoir)): - return true - case (.replaceComponent(.pump), .replaceComponent(.pump)): - return true - case (.replaceComponent(.infusionSet), .replaceComponent(.infusionSet)): - return true - default: - return false - } - } } /// A subset of replaceable component types public enum ReplaceableComponent: String { case reservoir - case pump // base/ pod/ patch + case pump // Base, pod or patch full replacement case infusionSet } @@ -149,11 +118,11 @@ extension PumpEventType { case .basal: return 9 case .replaceComponent(componentType: .reservoir): - return 4 + return 10 case .replaceComponent(componentType: .pump): - return 4 + return 11 case .replaceComponent(componentType: .infusionSet): - return 4 + return 12 } } }