ShareClientExtension.swift 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // LoopFollow
  2. // ShareClientExtension.swift
  3. // Created by Jose Paredes on 2020-07-14.
  4. import Foundation
  5. import ShareClient
  6. public struct ShareGlucoseData: Decodable {
  7. var sgv: Int
  8. var date: TimeInterval
  9. var direction: String?
  10. enum CodingKeys: String, CodingKey {
  11. case sgv // Sensor Blood Glucose
  12. case mbg // Manual Blood Glucose
  13. case glucose // Other type of entry
  14. case date
  15. case direction
  16. }
  17. // Decoder initializer for handling JSON data
  18. public init(from decoder: Decoder) throws {
  19. let container = try decoder.container(keyedBy: CodingKeys.self)
  20. if let glucoseValue = try? container.decode(Double.self, forKey: .sgv) {
  21. sgv = Int(glucoseValue.rounded())
  22. } else if let mbgValue = try? container.decode(Double.self, forKey: .mbg) {
  23. sgv = Int(mbgValue.rounded())
  24. } else if let mbgValue = try? container.decode(Double.self, forKey: .glucose) {
  25. sgv = Int(mbgValue.rounded())
  26. } else {
  27. throw DecodingError.dataCorruptedError(forKey: .sgv, in: container, debugDescription: "Expected to decode Double for sgv, mbg or glucose.")
  28. }
  29. // Decode the date and optional direction
  30. date = try container.decode(TimeInterval.self, forKey: .date)
  31. direction = try container.decodeIfPresent(String.self, forKey: .direction)
  32. }
  33. public init(sgv: Int, date: TimeInterval, direction: String?) {
  34. self.sgv = sgv
  35. self.date = date
  36. self.direction = direction
  37. }
  38. }
  39. private var TrendTable: [String] = [
  40. "NONE", // 0
  41. "DoubleUp", // 1
  42. "SingleUp", // 2
  43. "FortyFiveUp", // 3
  44. "Flat", // 4
  45. "FortyFiveDown", // 5
  46. "SingleDown", // 6
  47. "DoubleDown", // 7
  48. "NOT COMPUTABLE", // 8
  49. "RATE OUT OF RANGE" // 9
  50. ]
  51. // TODO: probably better to make this an inherited class rather than an extension
  52. extension ShareClient {
  53. public func fetchData(_ entries: Int, callback: @escaping (ShareError?, [ShareGlucoseData]?) -> Void) {
  54. self.fetchLast(entries) { (error, result) -> () in
  55. guard error == nil, let result = result else {
  56. return callback(error ?? .fetchError, nil)
  57. }
  58. // parse data to conanical form
  59. var shareData = [ShareGlucoseData]()
  60. for item in result {
  61. var trend = Int(item.trend)
  62. if trend < 0 || trend >= TrendTable.count {
  63. trend = 0
  64. }
  65. let newShareData = ShareGlucoseData(
  66. sgv: Int(item.glucose),
  67. date: item.timestamp.timeIntervalSince1970,
  68. direction: TrendTable[trend]
  69. )
  70. shareData.append(newShareData)
  71. }
  72. callback(nil, shareData)
  73. }
  74. }
  75. }