BloodGlucose.swift 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import Foundation
  2. struct BloodGlucose: JSON, Identifiable, Hashable {
  3. enum Direction: String, JSON {
  4. case tripleUp = "TripleUp"
  5. case doubleUp = "DoubleUp"
  6. case singleUp = "SingleUp"
  7. case fortyFiveUp = "FortyFiveUp"
  8. case flat = "Flat"
  9. case fortyFiveDown = "FortyFiveDown"
  10. case singleDown = "SingleDown"
  11. case doubleDown = "DoubleDown"
  12. case tripleDown = "TripleDown"
  13. case none = "NONE"
  14. case notComputable = "NOT COMPUTABLE"
  15. case rateOutOfRange = "RATE OUT OF RANGE"
  16. }
  17. var _id = UUID().uuidString
  18. var id: String {
  19. _id
  20. }
  21. var sgv: Int?
  22. let direction: Direction?
  23. let date: UInt64
  24. let dateString: Date
  25. let filtered: Double?
  26. let noise: Int?
  27. var glucose: Int?
  28. var isStateValid: Bool { sgv ?? 0 >= 39 && noise ?? 1 != 4 }
  29. }
  30. enum GlucoseUnits: String, JSON {
  31. case mgdL = "mg/dL"
  32. case mmolL = "mmol/L"
  33. static let exchangeRate: Decimal = 0.0555
  34. }
  35. extension Int {
  36. var asMmolL: Decimal {
  37. Decimal(self) * GlucoseUnits.exchangeRate
  38. }
  39. }
  40. extension Decimal {
  41. var asMmolL: Decimal {
  42. self * GlucoseUnits.exchangeRate
  43. }
  44. var asMgdL: Decimal {
  45. self / GlucoseUnits.exchangeRate
  46. }
  47. }
  48. extension Double {
  49. var asMmolL: Decimal {
  50. Decimal(self) * GlucoseUnits.exchangeRate
  51. }
  52. var asMgdL: Decimal {
  53. Decimal(self) / GlucoseUnits.exchangeRate
  54. }
  55. }