| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- import Foundation
- struct PushMessage: Codable, Sendable {
- var user: String
- var commandType: TrioRemoteControl.CommandType
- var bolusAmount: Decimal?
- var target: Int?
- var duration: Int?
- var carbs: Int?
- var protein: Int?
- var fat: Int?
- var sharedSecret: String
- var timestamp: TimeInterval
- var overrideName: String?
- var scheduledTime: TimeInterval?
- var returnNotification: ReturnNotificationInfo?
- struct ReturnNotificationInfo: Codable, Sendable {
- let productionEnvironment: Bool
- let deviceToken: String
- let bundleId: String
- let teamId: String
- let keyId: String
- let apnsKey: String
- enum CodingKeys: String, CodingKey {
- case productionEnvironment = "production_environment"
- case deviceToken = "device_token"
- case bundleId = "bundle_id"
- case teamId = "team_id"
- case keyId = "key_id"
- case apnsKey = "apns_key"
- }
- }
- enum CodingKeys: String, CodingKey {
- case aps
- case user
- case commandType = "command_type"
- case bolusAmount = "bolus_amount"
- case target
- case duration
- case carbs
- case protein
- case fat
- case sharedSecret = "shared_secret"
- case timestamp
- case overrideName
- case scheduledTime = "scheduled_time"
- case returnNotification = "return_notification"
- }
- func encode(to encoder: Encoder) throws {
- var container = encoder.container(keyedBy: CodingKeys.self)
- try container.encode(user, forKey: .user)
- try container.encode(commandType, forKey: .commandType)
- try container.encodeIfPresent(bolusAmount, forKey: .bolusAmount)
- try container.encodeIfPresent(target, forKey: .target)
- try container.encodeIfPresent(duration, forKey: .duration)
- try container.encodeIfPresent(carbs, forKey: .carbs)
- try container.encodeIfPresent(protein, forKey: .protein)
- try container.encodeIfPresent(fat, forKey: .fat)
- try container.encode(sharedSecret, forKey: .sharedSecret)
- try container.encode(timestamp, forKey: .timestamp)
- try container.encodeIfPresent(overrideName, forKey: .overrideName)
- try container.encodeIfPresent(scheduledTime, forKey: .scheduledTime)
- try container.encodeIfPresent(returnNotification, forKey: .returnNotification)
- }
- init(from decoder: Decoder) throws {
- let container = try decoder.container(keyedBy: CodingKeys.self)
- user = try container.decode(String.self, forKey: .user)
- commandType = try container.decode(TrioRemoteControl.CommandType.self, forKey: .commandType)
- bolusAmount = try container.decodeIfPresent(Decimal.self, forKey: .bolusAmount)
- target = try container.decodeIfPresent(Int.self, forKey: .target)
- duration = try container.decodeIfPresent(Int.self, forKey: .duration)
- carbs = try container.decodeIfPresent(Int.self, forKey: .carbs)
- protein = try container.decodeIfPresent(Int.self, forKey: .protein)
- fat = try container.decodeIfPresent(Int.self, forKey: .fat)
- sharedSecret = try container.decode(String.self, forKey: .sharedSecret)
- timestamp = try container.decode(TimeInterval.self, forKey: .timestamp)
- overrideName = try container.decodeIfPresent(String.self, forKey: .overrideName)
- scheduledTime = try container.decodeIfPresent(TimeInterval.self, forKey: .scheduledTime)
- returnNotification = try container.decodeIfPresent(ReturnNotificationInfo.self, forKey: .returnNotification)
- }
- init(
- user: String,
- commandType: TrioRemoteControl.CommandType,
- bolusAmount: Decimal? = nil,
- target: Int? = nil,
- duration: Int? = nil,
- carbs: Int? = nil,
- protein: Int? = nil,
- fat: Int? = nil,
- sharedSecret: String,
- timestamp: TimeInterval,
- overrideName: String? = nil,
- scheduledTime: TimeInterval? = nil,
- returnNotification: ReturnNotificationInfo? = nil
- ) {
- self.user = user
- self.commandType = commandType
- self.bolusAmount = bolusAmount
- self.target = target
- self.duration = duration
- self.carbs = carbs
- self.protein = protein
- self.fat = fat
- self.sharedSecret = sharedSecret
- self.timestamp = timestamp
- self.overrideName = overrideName
- self.scheduledTime = scheduledTime
- self.returnNotification = returnNotification
- }
- func humanReadableDescription() -> String {
- var description = "User: \(user). Command Type: \(commandType.description). "
- if let override = overrideName {
- description += "Override Name: \(override). "
- }
- switch commandType {
- case .bolus:
- if let amount = bolusAmount {
- description += "Bolus Amount: \(amount) units."
- } else {
- description += "Bolus Amount: unknown."
- }
- case .tempTarget:
- let targetDesc = target != nil ? "\(target!) mg/dL" : "unknown target"
- let durationDesc = duration != nil ? "\(duration!) minutes" : "unknown duration"
- description += "Temp Target: \(targetDesc), Duration: \(durationDesc)."
- case .cancelTempTarget:
- description += "Cancel Temp Target command."
- case .meal:
- let carbsDesc = carbs != nil ? "\(carbs!)g carbs" : "unknown carbs"
- let fatDesc = fat != nil ? "\(fat!)g fat" : "unknown fat"
- let proteinDesc = protein != nil ? "\(protein!)g protein" : "unknown protein"
- description += "Meal with \(carbsDesc), \(fatDesc), \(proteinDesc)."
- case .startOverride:
- if let override = overrideName {
- description += "Start Override: \(override)."
- } else {
- description += "Start Override: unknown override name."
- }
- case .cancelOverride:
- description += "Cancel Override command."
- }
- if let scheduledTime = scheduledTime {
- let date = Date(timeIntervalSince1970: scheduledTime)
- let formatter = DateFormatter()
- formatter.dateStyle = .short
- formatter.timeStyle = .short
- let dateString = formatter.string(from: date)
- description += " Scheduled for: \(dateString)."
- }
- return description
- }
- }
|