PushMessage.swift 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. import Foundation
  2. enum TRCCommandType: String, Codable {
  3. case bolus
  4. case tempTarget = "temp_target"
  5. case cancelTempTarget = "cancel_temp_target"
  6. case meal
  7. case startOverride = "start_override"
  8. case cancelOverride = "cancel_override"
  9. var description: String {
  10. switch self {
  11. case .bolus:
  12. return "Bolus"
  13. case .tempTarget:
  14. return "Temporary Target"
  15. case .cancelTempTarget:
  16. return "Cancel Temporary Target"
  17. case .meal:
  18. return "Meal"
  19. case .startOverride:
  20. return "Start Override"
  21. case .cancelOverride:
  22. return "Cancel Override"
  23. }
  24. }
  25. }
  26. struct PushMessage: Codable {
  27. var user: String
  28. var commandType: TRCCommandType
  29. var bolusAmount: Decimal?
  30. var target: Int?
  31. var duration: Int?
  32. var carbs: Int?
  33. var protein: Int?
  34. var fat: Int?
  35. var sharedSecret: String
  36. var timestamp: TimeInterval
  37. var overrideName: String?
  38. enum CodingKeys: String, CodingKey {
  39. case aps
  40. case user
  41. case commandType = "command_type"
  42. case bolusAmount = "bolus_amount"
  43. case target
  44. case duration
  45. case carbs
  46. case protein
  47. case fat
  48. case sharedSecret = "shared_secret"
  49. case timestamp
  50. case overrideName
  51. }
  52. func encode(to encoder: Encoder) throws {
  53. var container = encoder.container(keyedBy: CodingKeys.self)
  54. try container.encode(user, forKey: .user)
  55. try container.encode(commandType, forKey: .commandType)
  56. try container.encodeIfPresent(bolusAmount, forKey: .bolusAmount)
  57. try container.encodeIfPresent(target, forKey: .target)
  58. try container.encodeIfPresent(duration, forKey: .duration)
  59. try container.encodeIfPresent(carbs, forKey: .carbs)
  60. try container.encodeIfPresent(protein, forKey: .protein)
  61. try container.encodeIfPresent(fat, forKey: .fat)
  62. try container.encode(sharedSecret, forKey: .sharedSecret)
  63. try container.encode(timestamp, forKey: .timestamp)
  64. try container.encodeIfPresent(overrideName, forKey: .overrideName)
  65. }
  66. init(from decoder: Decoder) throws {
  67. let container = try decoder.container(keyedBy: CodingKeys.self)
  68. user = try container.decode(String.self, forKey: .user)
  69. commandType = try container.decode(TRCCommandType.self, forKey: .commandType)
  70. bolusAmount = try container.decodeIfPresent(Decimal.self, forKey: .bolusAmount)
  71. target = try container.decodeIfPresent(Int.self, forKey: .target)
  72. duration = try container.decodeIfPresent(Int.self, forKey: .duration)
  73. carbs = try container.decodeIfPresent(Int.self, forKey: .carbs)
  74. protein = try container.decodeIfPresent(Int.self, forKey: .protein)
  75. fat = try container.decodeIfPresent(Int.self, forKey: .fat)
  76. sharedSecret = try container.decode(String.self, forKey: .sharedSecret)
  77. timestamp = try container.decode(TimeInterval.self, forKey: .timestamp)
  78. overrideName = try container.decodeIfPresent(String.self, forKey: .overrideName)
  79. }
  80. init(
  81. user: String,
  82. commandType: TRCCommandType,
  83. bolusAmount: Decimal? = nil,
  84. target: Int? = nil,
  85. duration: Int? = nil,
  86. carbs: Int? = nil,
  87. protein: Int? = nil,
  88. fat: Int? = nil,
  89. sharedSecret: String,
  90. timestamp: TimeInterval,
  91. overrideName: String? = nil
  92. ) {
  93. self.user = user
  94. self.commandType = commandType
  95. self.bolusAmount = bolusAmount
  96. self.target = target
  97. self.duration = duration
  98. self.carbs = carbs
  99. self.protein = protein
  100. self.fat = fat
  101. self.sharedSecret = sharedSecret
  102. self.timestamp = timestamp
  103. self.overrideName = overrideName
  104. }
  105. func humanReadableDescription() -> String {
  106. var description = "User: \(user). Command Type: \(commandType.description). "
  107. if let override = overrideName {
  108. description += "Override Name: \(override). "
  109. }
  110. switch commandType {
  111. case .bolus:
  112. if let amount = bolusAmount {
  113. description += "Bolus Amount: \(amount) units."
  114. } else {
  115. description += "Bolus Amount: unknown."
  116. }
  117. case .tempTarget:
  118. let targetDesc = target != nil ? "\(target!) mg/dL" : "unknown target"
  119. let durationDesc = duration != nil ? "\(duration!) minutes" : "unknown duration"
  120. description += "Temp Target: \(targetDesc), Duration: \(durationDesc)."
  121. case .cancelTempTarget:
  122. description += "Cancel Temp Target command."
  123. case .meal:
  124. let carbsDesc = carbs != nil ? "\(carbs!)g carbs" : "unknown carbs"
  125. let fatDesc = fat != nil ? "\(fat!)g fat" : "unknown fat"
  126. let proteinDesc = protein != nil ? "\(protein!)g protein" : "unknown protein"
  127. description += "Meal with \(carbsDesc), \(fatDesc), \(proteinDesc)."
  128. case .startOverride:
  129. if let override = overrideName {
  130. description += "Start Override: \(override)."
  131. } else {
  132. description += "Start Override: unknown override name."
  133. }
  134. case .cancelOverride:
  135. description += "Cancel Override command."
  136. }
  137. return description
  138. }
  139. }