-
Notifications
You must be signed in to change notification settings - Fork 1.3k
/
Copy pathLoopSettingsUserInfo.swift
115 lines (94 loc) · 3.65 KB
/
LoopSettingsUserInfo.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
//
// LoopSettingsUserInfo.swift
// Loop
//
// Copyright © 2018 LoopKit Authors. All rights reserved.
//
import LoopCore
import LoopKit
struct LoopSettingsUserInfo: Equatable {
var loopSettings: LoopSettings
var scheduleOverride: TemporaryScheduleOverride?
var preMealOverride: TemporaryScheduleOverride?
public mutating func enablePreMealOverride(at date: Date = Date(), for duration: TimeInterval) {
preMealOverride = makePreMealOverride(beginningAt: date, for: duration)
}
private func makePreMealOverride(beginningAt date: Date = Date(), for duration: TimeInterval) -> TemporaryScheduleOverride? {
guard let preMealTargetRange = loopSettings.preMealTargetRange else {
return nil
}
return TemporaryScheduleOverride(
context: .preMeal,
settings: TemporaryScheduleOverrideSettings(targetRange: preMealTargetRange),
startDate: date,
duration: .finite(duration),
enactTrigger: .local,
syncIdentifier: UUID()
)
}
public mutating func clearOverride(matching context: TemporaryScheduleOverride.Context? = nil) {
if context == .preMeal {
preMealOverride = nil
return
}
guard let scheduleOverride = scheduleOverride else { return }
if let context = context {
if scheduleOverride.context == context {
self.scheduleOverride = nil
}
} else {
self.scheduleOverride = nil
}
}
public func nonPreMealOverrideEnabled(at date: Date = Date()) -> Bool {
return scheduleOverride?.isActive(at: date) == true
}
public mutating func legacyWorkoutOverride(beginningAt date: Date = Date(), for duration: TimeInterval) -> TemporaryScheduleOverride? {
guard let legacyWorkoutTargetRange = loopSettings.legacyWorkoutTargetRange else {
return nil
}
return TemporaryScheduleOverride(
context: .legacyWorkout,
settings: TemporaryScheduleOverrideSettings(targetRange: legacyWorkoutTargetRange),
startDate: date,
duration: duration.isInfinite ? .indefinite : .finite(duration),
enactTrigger: .local,
syncIdentifier: UUID()
)
}
}
extension LoopSettingsUserInfo: RawRepresentable {
typealias RawValue = [String: Any]
static let name = "LoopSettingsUserInfo"
static let version = 1
init?(rawValue: RawValue) {
guard rawValue["v"] as? Int == LoopSettingsUserInfo.version,
rawValue["name"] as? String == LoopSettingsUserInfo.name,
let settingsRaw = rawValue["s"] as? LoopSettings.RawValue,
let loopSettings = LoopSettings(rawValue: settingsRaw)
else {
return nil
}
self.loopSettings = loopSettings
if let rawScheduleOverride = rawValue["o"] as? TemporaryScheduleOverride.RawValue {
self.scheduleOverride = TemporaryScheduleOverride(rawValue: rawScheduleOverride)
} else {
self.scheduleOverride = nil
}
if let rawPreMealOverride = rawValue["p"] as? TemporaryScheduleOverride.RawValue {
self.preMealOverride = TemporaryScheduleOverride(rawValue: rawPreMealOverride)
} else {
self.preMealOverride = nil
}
}
var rawValue: RawValue {
var raw: RawValue = [
"v": LoopSettingsUserInfo.version,
"name": LoopSettingsUserInfo.name,
"s": loopSettings.rawValue
]
raw["o"] = scheduleOverride?.rawValue
raw["p"] = preMealOverride?.rawValue
return raw
}
}