ShareClientExtension.swift 3.0 KB

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