hypertrack-sdk-react-native 8.2.1 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/CHANGELOG.md +28 -1
  2. package/CONTRIBUTING.md +32 -110
  3. package/{LICENSE → LICENSE.md} +2 -0
  4. package/README.md +20 -40
  5. package/android/build.gradle +112 -113
  6. package/android/gradle.properties +1 -1
  7. package/android/src/main/java/com/reactnativehypertracksdk/HyperTrackReactNativePlugin.kt +209 -0
  8. package/android/src/main/java/com/reactnativehypertracksdk/HyperTrackSdkPackage.kt +2 -4
  9. package/android/src/main/java/com/reactnativehypertracksdk/ReactNativeSerialization.kt +88 -0
  10. package/android/src/main/java/com/reactnativehypertracksdk/common/Geotag.kt +9 -0
  11. package/android/src/main/java/com/reactnativehypertracksdk/common/HyperTrackError.kt +27 -0
  12. package/android/src/main/java/com/reactnativehypertracksdk/common/HyperTrackSdkWrapper.kt +243 -0
  13. package/android/src/main/java/com/reactnativehypertracksdk/common/LocationError.kt +9 -0
  14. package/android/src/main/java/com/reactnativehypertracksdk/common/Result.kt +48 -0
  15. package/android/src/main/java/com/reactnativehypertracksdk/common/SdkInitParams.kt +46 -0
  16. package/android/src/main/java/com/reactnativehypertracksdk/common/SdkMethod.kt +20 -0
  17. package/android/src/main/java/com/reactnativehypertracksdk/common/Serialization.kt +196 -0
  18. package/hypertrack-sdk-react-native.podspec +2 -2
  19. package/ios/HyperTrackReactNativePlugin.m +54 -0
  20. package/ios/HyperTrackReactNativePlugin.swift +253 -0
  21. package/ios/HyperTrackSdk-Bridging-Header.h +2 -0
  22. package/ios/HyperTrackSdk.xcodeproj/project.pbxproj +8 -11
  23. package/ios/common/DictionaryDecoder.swift +28 -0
  24. package/ios/common/HyperTrackError.swift +20 -0
  25. package/ios/common/HyperTrackSDKWrapper.swift +118 -0
  26. package/ios/common/SDKInitParams.swift +11 -0
  27. package/ios/common/SDKMethod.swift +14 -0
  28. package/ios/common/Serialization.swift +270 -0
  29. package/lib/commonjs/HyperTrack/HyperTrack.js +141 -142
  30. package/lib/commonjs/HyperTrack/HyperTrack.js.map +1 -1
  31. package/lib/commonjs/HyperTrack/data_types/HyperTrackError.js +31 -0
  32. package/lib/commonjs/HyperTrack/data_types/HyperTrackError.js.map +1 -0
  33. package/lib/commonjs/HyperTrack/data_types/Location.js +2 -0
  34. package/lib/commonjs/HyperTrack/data_types/Location.js.map +1 -0
  35. package/lib/commonjs/HyperTrack/data_types/LocationError.js +6 -0
  36. package/lib/commonjs/HyperTrack/data_types/LocationError.js.map +1 -0
  37. package/lib/commonjs/HyperTrack/data_types/SdkInitParams.js +2 -0
  38. package/lib/commonjs/HyperTrack/data_types/SdkInitParams.js.map +1 -0
  39. package/lib/commonjs/HyperTrack/data_types/internal/DeviceId.js +2 -0
  40. package/lib/commonjs/HyperTrack/data_types/internal/DeviceId.js.map +1 -0
  41. package/lib/commonjs/HyperTrack/data_types/internal/DeviceName.js +2 -0
  42. package/lib/commonjs/HyperTrack/data_types/internal/DeviceName.js.map +1 -0
  43. package/lib/commonjs/HyperTrack/data_types/internal/Geotag.js +2 -0
  44. package/lib/commonjs/HyperTrack/data_types/internal/Geotag.js.map +1 -0
  45. package/lib/commonjs/HyperTrack/data_types/internal/HyperTrackErrorInternal.js +2 -0
  46. package/lib/commonjs/HyperTrack/data_types/internal/HyperTrackErrorInternal.js.map +1 -0
  47. package/lib/commonjs/HyperTrack/data_types/internal/IsAvailable.js +2 -0
  48. package/lib/commonjs/HyperTrack/data_types/internal/IsAvailable.js.map +1 -0
  49. package/lib/commonjs/HyperTrack/data_types/internal/IsTracking.js +2 -0
  50. package/lib/commonjs/HyperTrack/data_types/internal/IsTracking.js.map +1 -0
  51. package/lib/commonjs/HyperTrack/data_types/internal/LocationErrorInternal.js +6 -0
  52. package/lib/commonjs/HyperTrack/data_types/internal/LocationErrorInternal.js.map +1 -0
  53. package/lib/commonjs/HyperTrack/data_types/internal/LocationResponse.js +6 -0
  54. package/lib/commonjs/HyperTrack/data_types/internal/LocationResponse.js.map +1 -0
  55. package/lib/commonjs/index.js +28 -17
  56. package/lib/commonjs/index.js.map +1 -1
  57. package/lib/module/HyperTrack/HyperTrack.js +140 -134
  58. package/lib/module/HyperTrack/HyperTrack.js.map +1 -1
  59. package/lib/module/HyperTrack/data_types/HyperTrackError.js +24 -0
  60. package/lib/module/HyperTrack/data_types/HyperTrackError.js.map +1 -0
  61. package/lib/module/HyperTrack/data_types/Location.js +2 -0
  62. package/lib/module/HyperTrack/data_types/Location.js.map +1 -0
  63. package/lib/module/HyperTrack/data_types/LocationError.js +2 -0
  64. package/lib/module/HyperTrack/data_types/LocationError.js.map +1 -0
  65. package/lib/module/HyperTrack/data_types/SdkInitParams.js +2 -0
  66. package/lib/module/HyperTrack/data_types/SdkInitParams.js.map +1 -0
  67. package/lib/module/HyperTrack/data_types/internal/DeviceId.js +2 -0
  68. package/lib/module/HyperTrack/data_types/internal/DeviceId.js.map +1 -0
  69. package/lib/module/HyperTrack/data_types/internal/DeviceName.js +2 -0
  70. package/lib/module/HyperTrack/data_types/internal/DeviceName.js.map +1 -0
  71. package/lib/module/HyperTrack/data_types/internal/Geotag.js +2 -0
  72. package/lib/module/HyperTrack/data_types/internal/Geotag.js.map +1 -0
  73. package/lib/module/HyperTrack/data_types/internal/HyperTrackErrorInternal.js +2 -0
  74. package/lib/module/HyperTrack/data_types/internal/HyperTrackErrorInternal.js.map +1 -0
  75. package/lib/module/HyperTrack/data_types/internal/IsAvailable.js +2 -0
  76. package/lib/module/HyperTrack/data_types/internal/IsAvailable.js.map +1 -0
  77. package/lib/module/HyperTrack/data_types/internal/IsTracking.js +2 -0
  78. package/lib/module/HyperTrack/data_types/internal/IsTracking.js.map +1 -0
  79. package/lib/module/HyperTrack/data_types/internal/LocationErrorInternal.js +2 -0
  80. package/lib/module/HyperTrack/data_types/internal/LocationErrorInternal.js.map +1 -0
  81. package/lib/module/HyperTrack/data_types/internal/LocationResponse.js +2 -0
  82. package/lib/module/HyperTrack/data_types/internal/LocationResponse.js.map +1 -0
  83. package/lib/module/index.js +4 -1
  84. package/lib/module/index.js.map +1 -1
  85. package/lib/typescript/HyperTrack/HyperTrack.d.ts +66 -100
  86. package/lib/typescript/HyperTrack/data_types/HyperTrackError.d.ts +20 -0
  87. package/lib/typescript/HyperTrack/data_types/Location.d.ts +7 -0
  88. package/lib/typescript/HyperTrack/data_types/LocationError.d.ts +8 -0
  89. package/lib/typescript/HyperTrack/data_types/SdkInitParams.d.ts +5 -0
  90. package/lib/typescript/HyperTrack/data_types/internal/DeviceId.d.ts +4 -0
  91. package/lib/typescript/HyperTrack/data_types/internal/DeviceName.d.ts +4 -0
  92. package/lib/typescript/HyperTrack/data_types/internal/Geotag.d.ts +3 -0
  93. package/lib/typescript/HyperTrack/data_types/internal/HyperTrackErrorInternal.d.ts +4 -0
  94. package/lib/typescript/HyperTrack/data_types/internal/IsAvailable.d.ts +4 -0
  95. package/lib/typescript/HyperTrack/data_types/internal/IsTracking.d.ts +4 -0
  96. package/lib/typescript/HyperTrack/data_types/internal/LocationErrorInternal.d.ts +12 -0
  97. package/lib/typescript/HyperTrack/data_types/internal/LocationResponse.d.ts +11 -0
  98. package/lib/typescript/index.d.ts +4 -1
  99. package/package.json +156 -156
  100. package/src/HyperTrack/HyperTrack.ts +163 -163
  101. package/src/HyperTrack/data_types/HyperTrackError.ts +22 -0
  102. package/src/HyperTrack/data_types/Location.ts +7 -0
  103. package/src/HyperTrack/data_types/LocationError.ts +11 -0
  104. package/src/HyperTrack/data_types/SdkInitParams.ts +5 -0
  105. package/src/HyperTrack/data_types/internal/DeviceId.ts +4 -0
  106. package/src/HyperTrack/data_types/internal/DeviceName.ts +4 -0
  107. package/src/HyperTrack/data_types/internal/Geotag.ts +3 -0
  108. package/src/HyperTrack/data_types/internal/HyperTrackErrorInternal.ts +4 -0
  109. package/src/HyperTrack/data_types/internal/IsAvailable.ts +4 -0
  110. package/src/HyperTrack/data_types/internal/IsTracking.ts +4 -0
  111. package/src/HyperTrack/data_types/internal/LocationErrorInternal.ts +14 -0
  112. package/src/HyperTrack/data_types/internal/LocationResponse.ts +14 -0
  113. package/src/index.tsx +4 -7
  114. package/android/src/main/java/com/reactnativehypertracksdk/HyperTrackModule.kt +0 -284
  115. package/ios/HyperTrack.h +0 -7
  116. package/ios/HyperTrack.m +0 -384
@@ -0,0 +1,118 @@
1
+ import HyperTrack
2
+
3
+ enum SuccessResult {
4
+ case void
5
+ case dict(Dictionary<String, Any>)
6
+ }
7
+
8
+ enum FailureResult: Error {
9
+ case fatalError(_ message: String)
10
+ case error(_ message: String)
11
+ }
12
+
13
+ var sdkInstance: HyperTrack! // initialize method is guaranteed to be called (by non-native side) prior to any access to the SDK instance
14
+
15
+ func initializeSDK(
16
+ _ params: Dictionary<String, Any>
17
+ ) -> Result<SuccessResult, FailureResult> {
18
+ if let sdkInitParams = SDKInitParams(params) {
19
+ let publishableKey = HyperTrack.PublishableKey(params["publishableKey"] as! String)
20
+ if let publishableKey = publishableKey {
21
+ switch HyperTrack.makeSDK(
22
+ publishableKey: publishableKey,
23
+ mockLocationsAllowed: sdkInitParams.allowMockLocations
24
+ ) {
25
+ case let .success(hyperTrack):
26
+ sdkInstance = hyperTrack
27
+ HyperTrack.isLoggingEnabled = sdkInitParams.loggingEnabled
28
+ return .success(.void)
29
+ case let .failure(fatalError):
30
+ return .failure(mapFatalError(fatalError: fatalError))
31
+ }
32
+ } else {
33
+ return .failure(.fatalError("Invalid publishable key"))
34
+ }
35
+ } else {
36
+ return .failure(.error("Invalid SDK init parameters \(params)"))
37
+ }
38
+ }
39
+
40
+ func getDeviceID() -> Result<SuccessResult, FailureResult> {
41
+ .success(.dict(serializeDeviceId(sdkInstance.deviceID)))
42
+ }
43
+
44
+ func getLocation() -> Result<SuccessResult, FailureResult> {
45
+ .success(.dict(serializeLocationResult(sdkInstance.location)))
46
+ }
47
+
48
+ func startTracking() -> Result<SuccessResult, FailureResult> {
49
+ .success(asVoid(sdkInstance.start()))
50
+ }
51
+
52
+ func stopTracking() -> Result<SuccessResult, FailureResult> {
53
+ .success(asVoid(sdkInstance.stop()))
54
+ }
55
+
56
+ func setAvailability(
57
+ _ availability: Dictionary<String, Any>
58
+ ) -> Result<SuccessResult, FailureResult> {
59
+ deserializeAvailability(availability).flatMap { (isAvailable:Bool) in
60
+ if(isAvailable) {
61
+ sdkInstance.availability = .available
62
+ } else {
63
+ sdkInstance.availability = .unavailable
64
+ }
65
+ return .success(.void)
66
+ }
67
+ }
68
+
69
+ func setName(_ args: Dictionary<String, Any>) -> Result<SuccessResult, FailureResult> {
70
+ deserializeDeviceName(args).flatMap({ (name: String) in
71
+ .success(asVoid(sdkInstance.setDeviceName(name)))
72
+ })
73
+
74
+ }
75
+
76
+ func setMetadata(_ map: Dictionary<String, Any>) -> Result<SuccessResult, FailureResult> {
77
+ sdkInstance.metadata = getJSON(map)
78
+ return .success(.void)
79
+ }
80
+
81
+ func isTracking() -> Result<SuccessResult, FailureResult> {
82
+ .success(.dict(serializeIsTracking(sdkInstance.isTracking)))
83
+ }
84
+
85
+ func isAvailable() -> Result<SuccessResult, FailureResult> {
86
+ .success(.dict(serializeIsAvailable(sdkInstance.availability)))
87
+ }
88
+
89
+ func addGeotag(_ args: Dictionary<String, Any>) -> Result<SuccessResult, FailureResult> {
90
+ return deserializeGeotagData(args).flatMap { data in
91
+ let metadata: HyperTrack.JSON.Object = getJSON(data)
92
+ let result = sdkInstance.addGeotag(metadata)
93
+ return .success(.dict(serializeLocationResult(result)))
94
+ }
95
+ }
96
+
97
+ func sync() -> Result<SuccessResult, FailureResult> {
98
+ .success(asVoid(sdkInstance.syncDeviceSettings()))
99
+ }
100
+
101
+ func asVoid(_ void: Void) -> SuccessResult {
102
+ .void
103
+ }
104
+
105
+ private func mapFatalError(fatalError: HyperTrack.FatalError) -> FailureResult {
106
+ switch fatalError {
107
+ case .developmentError(.missingLocationUpdatesBackgroundModeCapability):
108
+ return .fatalError("missingLocationUpdatesBackgroundModeCapability")
109
+ case .developmentError(.runningOnSimulatorUnsupported):
110
+ return .fatalError("runningOnSimulatorUnsupported")
111
+ case .productionError(.locationServicesUnavalible):
112
+ return .error("locationServicesUnavalible")
113
+ case .productionError(.motionActivityServicesUnavalible):
114
+ return .error("motionActivityServicesUnavalible")
115
+ case .productionError(.motionActivityPermissionsDenied):
116
+ return .fatalError("motionActivityPermissionsDenied")
117
+ }
118
+ }
@@ -0,0 +1,11 @@
1
+ public struct SDKInitParams {
2
+ let publishableKey: String
3
+ let loggingEnabled: Bool
4
+ let allowMockLocations: Bool
5
+
6
+ init?(_ map: Dictionary<String, Any>) {
7
+ self.publishableKey = (map["publishableKey"] as! String)
8
+ self.loggingEnabled = (map["loggingEnabled"] as! Bool)
9
+ self.allowMockLocations = (map["allowMockLocations"] as! Bool)
10
+ }
11
+ }
@@ -0,0 +1,14 @@
1
+ enum SDKMethod: String {
2
+ case initialize = "initialize"
3
+ case getDeviceId = "getDeviceId"
4
+ case getLocation = "getLocation"
5
+ case startTracking = "startTracking"
6
+ case stopTracking = "stopTracking"
7
+ case setAvailability = "setAvailability"
8
+ case setName = "setName"
9
+ case setMetadata = "setMetadata"
10
+ case isTracking = "isTracking"
11
+ case isAvailable = "isAvailable"
12
+ case addGeotag = "addGeotag"
13
+ case sync = "sync"
14
+ }
@@ -0,0 +1,270 @@
1
+ import HyperTrack
2
+
3
+ private let keyType = "type"
4
+ private let keyValue = "value"
5
+
6
+ private let typeSuccess = "success"
7
+ private let typeFailure = "failure"
8
+ private let typeHyperTrackError = "hyperTrackError"
9
+ private let typeIsTracking = "isTracking"
10
+ private let typeIsAvailable = "isAvailable"
11
+
12
+ let keyGeotagData = "data"
13
+
14
+ func getJSON(_ dictionary: Dictionary<String, Any>) -> HyperTrack.JSON.Object {
15
+ return try! DictionaryDecoder().decode(HyperTrack.JSON.Object.self, from: dictionary)
16
+ }
17
+
18
+ func getHyperTrackError(_ error: HyperTrack.UnrestorableError) -> HyperTrackError {
19
+ switch(error) {
20
+ case .invalidPublishableKey:
21
+ return HyperTrackError.invalidPublishableKey
22
+ case .motionActivityPermissionsDenied:
23
+ return HyperTrackError.locationPermissionsDenied
24
+ }
25
+ }
26
+
27
+ func getHyperTrackError(_ error: HyperTrack.RestorableError) -> HyperTrackError {
28
+ switch(error) {
29
+ case .locationPermissionsNotDetermined:
30
+ return HyperTrackError.locationPermissionsNotDetermined
31
+ case .motionActivityPermissionsNotDetermined:
32
+ return HyperTrackError.motionActivityPermissionsNotDetermined
33
+ case .locationPermissionsCantBeAskedInBackground:
34
+ return HyperTrackError.locationPermissionsNotDetermined
35
+ case .motionActivityPermissionsCantBeAskedInBackground:
36
+ return HyperTrackError.motionActivityPermissionsNotDetermined
37
+ case .locationPermissionsRestricted:
38
+ return HyperTrackError.locationPermissionsRestricted
39
+ case .motionActivityPermissionsRestricted:
40
+ return HyperTrackError.motionActivityPermissionsRestricted
41
+ case .locationPermissionsDenied:
42
+ return HyperTrackError.locationPermissionsDenied
43
+ case .locationPermissionsInsufficientForBackground:
44
+ return HyperTrackError.locationPermissionsInsufficientForBackground
45
+ case .locationServicesDisabled:
46
+ return HyperTrackError.locationServicesDisabled
47
+ case .motionActivityServicesDisabled:
48
+ return HyperTrackError.motionActivityServicesDisabled
49
+ case .networkConnectionUnavailable:
50
+ return HyperTrackError.networkConnectionUnavailable
51
+ case .trialEnded:
52
+ return HyperTrackError.blockedFromRunning
53
+ case .paymentDefault:
54
+ return HyperTrackError.blockedFromRunning
55
+ }
56
+ }
57
+
58
+ func getHyperTrackError(_ error: HyperTrack.HyperTrackError) -> HyperTrackError {
59
+ switch(error) {
60
+ case .locationPermissionsNotDetermined:
61
+ return .locationPermissionsNotDetermined
62
+ case .locationPermissionsInsufficientForBackground:
63
+ return .locationPermissionsInsufficientForBackground
64
+ case .locationPermissionsRestricted:
65
+ return .locationPermissionsRestricted
66
+ case .locationPermissionsReducedAccuracy:
67
+ return .locationPermissionsReducedAccuracy
68
+ case .locationPermissionsProvisional:
69
+ return .locationPermissionsProvisional
70
+ case .locationPermissionsDenied:
71
+ return .locationPermissionsDenied
72
+ case .locationServicesDisabled:
73
+ return .locationServicesDisabled
74
+ case .motionActivityPermissionsNotDetermined:
75
+ return .motionActivityPermissionsNotDetermined
76
+ case .motionActivityPermissionsDenied:
77
+ return .motionActivityPermissionsDenied
78
+ case .motionActivityServicesDisabled:
79
+ return .motionActivityServicesDisabled
80
+ case .motionActivityServicesUnavailable:
81
+ return .motionActivityServicesUnavailable
82
+ case .gpsSignalLost:
83
+ return .gpsSignalLost
84
+ case .locationMocked:
85
+ return .locationMocked
86
+ case .invalidPublishableKey:
87
+ return .invalidPublishableKey
88
+ case .blockedFromRunning:
89
+ return .blockedFromRunning
90
+ default:
91
+ preconditionFailure("Unknown error \(error)")
92
+ }
93
+ }
94
+
95
+ func serializeErrors(_ errors: Set<HyperTrack.HyperTrackError>) -> Array<Dictionary<String, Any>> {
96
+ return errors.map({ error in
97
+ serializeHyperTrackError(getHyperTrackError(error))
98
+ })
99
+ }
100
+
101
+ func serializeDeviceId(_ deviceId: String) -> Dictionary<String, Any> {
102
+ return [
103
+ keyType: "deviceID",
104
+ keyValue: deviceId
105
+ ]
106
+ }
107
+
108
+ func serializeLocationResult(_ result: Result<HyperTrack.Location, HyperTrack.LocationError>) -> Dictionary<String, Any> {
109
+ switch (result) {
110
+ case .success(let success):
111
+ return [
112
+ keyType: typeSuccess,
113
+ keyValue: [
114
+ keyType: "location",
115
+ keyValue: [
116
+ "latitude": success.latitude,
117
+ "longitude": success.longitude
118
+ ]
119
+ ]
120
+ ]
121
+ case .failure(let failure):
122
+ var locationError: Dictionary<String, Any>
123
+ switch(failure) {
124
+ case .locationPermissionsNotDetermined:
125
+ locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.locationPermissionsNotDetermined)
126
+ case .locationPermissionsCantBeAskedInBackground:
127
+ locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.locationPermissionsNotDetermined)
128
+ case .locationPermissionsInsufficientForBackground:
129
+ locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.locationPermissionsInsufficientForBackground)
130
+ case .locationPermissionsRestricted:
131
+ locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.locationPermissionsRestricted)
132
+ case .locationPermissionsReducedAccuracy:
133
+ locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.locationPermissionsReducedAccuracy)
134
+ case .locationPermissionsDenied:
135
+ locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.locationPermissionsDenied)
136
+ case .locationServicesDisabled:
137
+ locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.locationServicesDisabled)
138
+ case .motionActivityPermissionsNotDetermined:
139
+ locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.motionActivityPermissionsNotDetermined)
140
+ case .motionActivityPermissionsCantBeAskedInBackground:
141
+ locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.motionActivityPermissionsNotDetermined)
142
+ case .motionActivityPermissionsDenied:
143
+ locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.motionActivityPermissionsDenied)
144
+ case .motionActivityServicesDisabled:
145
+ locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.motionActivityServicesDisabled)
146
+
147
+ case .gpsSignalLost:
148
+ locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.gpsSignalLost)
149
+ case .locationMocked:
150
+ locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.locationMocked)
151
+ case .starting:
152
+ locationError = [
153
+ keyType: "starting"
154
+ ]
155
+ case .notRunning:
156
+ locationError = [
157
+ keyType: "notRunning"
158
+ ]
159
+ }
160
+
161
+ return [
162
+ keyType: typeFailure,
163
+ keyValue: locationError
164
+ ]
165
+ }
166
+ }
167
+
168
+ func serializeLocationResult(_ result: Result<HyperTrack.Location, HyperTrack.NoLocationError>) -> Dictionary<String, Any> {
169
+ switch (result) {
170
+ case .success(let success):
171
+ return [
172
+ keyType: typeSuccess,
173
+ keyValue: [
174
+ keyType: "location",
175
+ keyValue: [
176
+ "latitude": success.latitude,
177
+ "longitude": success.longitude
178
+ ]
179
+ ]
180
+ ]
181
+ case .failure(let failure):
182
+ var locationError: Dictionary<String, Any>
183
+ switch(failure) {
184
+ case .starting:
185
+ locationError = [
186
+ keyType: "starting"
187
+ ]
188
+ case .notRunning:
189
+ locationError = [
190
+ keyType: "notRunning"
191
+ ]
192
+ case .errors(let errors):
193
+ locationError = [
194
+ keyType: "errors",
195
+ keyValue: serializeErrors(errors)
196
+ ]
197
+ }
198
+
199
+ return [
200
+ keyType: typeFailure,
201
+ keyValue: locationError
202
+ ]
203
+ }
204
+ }
205
+
206
+ func serializeHyperTrackErrorAsLocationError(_ error: HyperTrackError) -> Dictionary<String, Any> {
207
+ return [
208
+ keyType: "errors",
209
+ keyValue: [
210
+ [
211
+ keyType: typeHyperTrackError,
212
+ keyValue: error.rawValue
213
+ ]
214
+ ]
215
+ ]
216
+ }
217
+
218
+ func serializeHyperTrackError(_ error: HyperTrackError) -> Dictionary<String, Any> {
219
+ return [
220
+ keyType: typeHyperTrackError,
221
+ keyValue: error.rawValue
222
+ ]
223
+ }
224
+
225
+ func serializeIsTracking(_ isTracking: Bool) -> Dictionary<String, Any> {
226
+ return [
227
+ keyType: typeIsTracking,
228
+ keyValue: isTracking
229
+ ]
230
+ }
231
+
232
+ func serializeIsAvailable(_ isAvailable: HyperTrack.Availability) -> Dictionary<String, Any> {
233
+ return [
234
+ keyType: typeIsAvailable,
235
+ keyValue: isAvailable == .available
236
+ ]
237
+ }
238
+
239
+ func deserializeDeviceName(_ data: Dictionary<String, Any>) -> Result<String, FailureResult> {
240
+ if (data[keyType] as? String != "deviceName") {
241
+ return .failure(.fatalError(getParseError(data, key: keyType)))
242
+ }
243
+ guard let value = data[keyValue] as? String else {
244
+ return .failure(.fatalError(getParseError(data, key: keyValue)))
245
+ }
246
+ return .success(value)
247
+ }
248
+
249
+ func deserializeAvailability(_ data: Dictionary<String, Any>) -> Result<Bool, FailureResult> {
250
+ if (data[keyType] as? String != typeIsAvailable) {
251
+ return .failure(.fatalError(getParseError(data, key: keyType)))
252
+ }
253
+ guard let value = data[keyValue] as? Bool else {
254
+ return .failure(.fatalError(getParseError(data, key: keyValue)))
255
+ }
256
+ return .success(value)
257
+ }
258
+
259
+ func deserializeGeotagData(
260
+ _ geotag: Dictionary<String, Any>
261
+ ) -> Result<Dictionary<String, Any>, FailureResult> {
262
+ guard let data = geotag[keyGeotagData] as? Dictionary<String, Any> else {
263
+ return .failure(.fatalError(getParseError(geotag, key: keyGeotagData)))
264
+ }
265
+ return .success(data)
266
+ }
267
+
268
+ func getParseError(_ data: Any, key: String) -> String {
269
+ return "Invalid input for key \(key): \(data)"
270
+ }