hypertrack-sdk-react-native 10.0.3 → 11.0.1

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 (70) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/CONTRIBUTING.md +1 -1
  3. package/README.md +2 -2
  4. package/android/build.gradle +5 -1
  5. package/android/gradle.properties +1 -1
  6. package/android/src/main/java/com/reactnativehypertracksdk/HyperTrackReactNativePlugin.kt +80 -115
  7. package/android/src/main/java/com/reactnativehypertracksdk/ReactNativeSerialization.kt +23 -3
  8. package/android/src/main/java/com/reactnativehypertracksdk/common/HyperTrackSdkWrapper.kt +87 -220
  9. package/android/src/main/java/com/reactnativehypertracksdk/common/SdkMethod.kt +11 -9
  10. package/android/src/main/java/com/reactnativehypertracksdk/common/Serialization.kt +216 -132
  11. package/android/src/main/java/com/reactnativehypertracksdk/common/{Result.kt → WrapperResult.kt} +9 -7
  12. package/hypertrack-sdk-react-native.podspec +1 -1
  13. package/ios/HyperTrackReactNativePlugin.m +13 -11
  14. package/ios/HyperTrackReactNativePlugin.swift +141 -114
  15. package/ios/common/DictionaryDecoder.swift +5 -5
  16. package/ios/common/HyperTrackSDKWrapper.swift +46 -80
  17. package/ios/common/SDKMethod.swift +13 -12
  18. package/ios/common/Serialization.swift +200 -245
  19. package/lib/commonjs/HyperTrack/HyperTrack.js +224 -124
  20. package/lib/commonjs/HyperTrack/HyperTrack.js.map +1 -1
  21. package/lib/commonjs/HyperTrack/data_types/HyperTrackError.js +13 -17
  22. package/lib/commonjs/HyperTrack/data_types/HyperTrackError.js.map +1 -1
  23. package/lib/commonjs/HyperTrack/data_types/internal/HyperTrackErrorInternal.js.map +1 -1
  24. package/lib/commonjs/HyperTrack/data_types/internal/Metadata.js +2 -0
  25. package/lib/commonjs/HyperTrack/data_types/internal/Metadata.js.map +1 -0
  26. package/lib/commonjs/HyperTrack/data_types/internal/Name.js +2 -0
  27. package/lib/commonjs/HyperTrack/data_types/internal/Name.js.map +1 -0
  28. package/lib/commonjs/index.js +0 -7
  29. package/lib/commonjs/index.js.map +1 -1
  30. package/lib/module/HyperTrack/HyperTrack.js +224 -124
  31. package/lib/module/HyperTrack/HyperTrack.js.map +1 -1
  32. package/lib/module/HyperTrack/data_types/HyperTrackError.js +13 -17
  33. package/lib/module/HyperTrack/data_types/HyperTrackError.js.map +1 -1
  34. package/lib/module/HyperTrack/data_types/internal/HyperTrackErrorInternal.js.map +1 -1
  35. package/lib/module/HyperTrack/data_types/internal/Metadata.js +2 -0
  36. package/lib/module/HyperTrack/data_types/internal/Metadata.js.map +1 -0
  37. package/lib/module/HyperTrack/data_types/internal/Name.js +2 -0
  38. package/lib/module/HyperTrack/data_types/internal/Name.js.map +1 -0
  39. package/lib/module/index.js +0 -1
  40. package/lib/module/index.js.map +1 -1
  41. package/lib/typescript/HyperTrack/HyperTrack.d.ts +106 -54
  42. package/lib/typescript/HyperTrack/data_types/HyperTrackError.d.ts +59 -17
  43. package/lib/typescript/HyperTrack/data_types/internal/HyperTrackErrorInternal.d.ts +1 -1
  44. package/lib/typescript/HyperTrack/data_types/internal/Metadata.d.ts +4 -0
  45. package/lib/typescript/HyperTrack/data_types/internal/Name.d.ts +7 -0
  46. package/lib/typescript/index.d.ts +0 -1
  47. package/package.json +1 -1
  48. package/src/HyperTrack/HyperTrack.ts +281 -161
  49. package/src/HyperTrack/data_types/HyperTrackError.ts +73 -18
  50. package/src/HyperTrack/data_types/internal/HyperTrackErrorInternal.ts +3 -3
  51. package/src/HyperTrack/data_types/internal/Metadata.ts +4 -0
  52. package/src/HyperTrack/data_types/internal/Name.ts +7 -0
  53. package/src/index.tsx +0 -1
  54. package/android/src/main/java/com/reactnativehypertracksdk/common/HyperTrackError.kt +0 -28
  55. package/android/src/main/java/com/reactnativehypertracksdk/common/LocationError.kt +0 -9
  56. package/android/src/main/java/com/reactnativehypertracksdk/common/SdkInitParams.kt +0 -44
  57. package/ios/common/HyperTrackError.swift +0 -20
  58. package/ios/common/SDKInitParams.swift +0 -13
  59. package/lib/commonjs/HyperTrack/data_types/SdkInitParams.js +0 -2
  60. package/lib/commonjs/HyperTrack/data_types/SdkInitParams.js.map +0 -1
  61. package/lib/commonjs/HyperTrack/data_types/internal/DeviceName.js +0 -2
  62. package/lib/commonjs/HyperTrack/data_types/internal/DeviceName.js.map +0 -1
  63. package/lib/module/HyperTrack/data_types/SdkInitParams.js +0 -2
  64. package/lib/module/HyperTrack/data_types/SdkInitParams.js.map +0 -1
  65. package/lib/module/HyperTrack/data_types/internal/DeviceName.js +0 -2
  66. package/lib/module/HyperTrack/data_types/internal/DeviceName.js.map +0 -1
  67. package/lib/typescript/HyperTrack/data_types/SdkInitParams.d.ts +0 -25
  68. package/lib/typescript/HyperTrack/data_types/internal/DeviceName.d.ts +0 -4
  69. package/src/HyperTrack/data_types/SdkInitParams.ts +0 -28
  70. package/src/HyperTrack/data_types/internal/DeviceName.ts +0 -4
@@ -1,102 +1,92 @@
1
1
  import HyperTrack
2
2
 
3
+ private let keyExpectedLocation = "expectedLocation"
4
+ private let keyGeotagData = "data"
3
5
  private let keyType = "type"
4
6
  private let keyValue = "value"
5
- private let keyGeotagData = "data"
6
- private let keyExpectedLocation = "expectedLocation"
7
7
 
8
- private let typeSuccess = "success"
8
+ private let typeError = "error"
9
9
  private let typeFailure = "failure"
10
- private let typeHyperTrackError = "hyperTrackError"
11
- private let typeIsTracking = "isTracking"
12
10
  private let typeIsAvailable = "isAvailable"
11
+ private let typeIsTracking = "isTracking"
13
12
  private let typeLocation = "location"
13
+ private let typeMetadata = "metadata"
14
+ private let typeName = "name"
15
+ private let typeSuccess = "success"
14
16
 
15
- func getJSON(_ dictionary: [String: Any]) -> HyperTrack.JSON.Object {
16
- return try! DictionaryDecoder().decode(HyperTrack.JSON.Object.self, from: dictionary)
17
+ func deserializeGeotagData(
18
+ _ args: [String: Any]
19
+ ) -> Result<GeotagData, FailureResult> {
20
+ guard let data = args[keyGeotagData] as? [String: Any] else {
21
+ return .failure(.fatalError(getParseError(args, key: keyGeotagData)))
22
+ }
23
+ if let expectedLocationData = args[keyExpectedLocation] as? [String: Any] {
24
+ let expectedLocation = deserializeLocation(expectedLocationData)
25
+ switch expectedLocation {
26
+ case let .failure(failure):
27
+ return .failure(failure)
28
+ case let .success(expectedLocation):
29
+ return .success(.init(data: data, expectedLocation: expectedLocation))
30
+ }
31
+ } else {
32
+ return .success(.init(data: data, expectedLocation: nil))
33
+ }
17
34
  }
18
35
 
19
- func getHyperTrackError(_ error: HyperTrack.UnrestorableError) -> HyperTrackError {
20
- switch error {
21
- case .invalidPublishableKey:
22
- return HyperTrackError.invalidPublishableKey
23
- case .motionActivityPermissionsDenied:
24
- return HyperTrackError.locationPermissionsDenied
36
+ func deserializeIsAvailable(_ data: [String: Any]) -> Result<Bool, FailureResult> {
37
+ if data[keyType] as? String != typeIsAvailable {
38
+ return .failure(.fatalError(getParseError(data, key: keyType)))
25
39
  }
40
+ guard let value = data[keyValue] as? Bool else {
41
+ return .failure(.fatalError(getParseError(data, key: keyValue)))
42
+ }
43
+ return .success(value)
26
44
  }
27
45
 
28
- func getHyperTrackError(_ error: HyperTrack.RestorableError) -> HyperTrackError {
29
- switch error {
30
- case .locationPermissionsNotDetermined:
31
- return HyperTrackError.locationPermissionsNotDetermined
32
- case .motionActivityPermissionsNotDetermined:
33
- return HyperTrackError.motionActivityPermissionsNotDetermined
34
- case .locationPermissionsCantBeAskedInBackground:
35
- return HyperTrackError.locationPermissionsNotDetermined
36
- case .motionActivityPermissionsCantBeAskedInBackground:
37
- return HyperTrackError.motionActivityPermissionsNotDetermined
38
- case .locationPermissionsRestricted:
39
- return HyperTrackError.locationPermissionsRestricted
40
- case .motionActivityPermissionsRestricted:
41
- return HyperTrackError.motionActivityPermissionsRestricted
42
- case .locationPermissionsDenied:
43
- return HyperTrackError.locationPermissionsDenied
44
- case .locationPermissionsInsufficientForBackground:
45
- return HyperTrackError.locationPermissionsInsufficientForBackground
46
- case .locationServicesDisabled:
47
- return HyperTrackError.locationServicesDisabled
48
- case .motionActivityServicesDisabled:
49
- return HyperTrackError.motionActivityServicesDisabled
50
- case .networkConnectionUnavailable:
51
- return HyperTrackError.networkConnectionUnavailable
52
- case .trialEnded:
53
- return HyperTrackError.blockedFromRunning
54
- case .paymentDefault:
55
- return HyperTrackError.blockedFromRunning
46
+ func deserializeIsTracking(_ data: [String: Any]) -> Result<Bool, FailureResult> {
47
+ if data[keyType] as? String != typeIsTracking {
48
+ return .failure(.fatalError(getParseError(data, key: keyType)))
49
+ }
50
+ guard let value = data[keyValue] as? Bool else {
51
+ return .failure(.fatalError(getParseError(data, key: keyValue)))
56
52
  }
53
+ return .success(value)
57
54
  }
58
55
 
59
- func getHyperTrackError(_ error: HyperTrack.HyperTrackError) -> HyperTrackError {
60
- switch error {
61
- case .locationPermissionsNotDetermined:
62
- return .locationPermissionsNotDetermined
63
- case .locationPermissionsInsufficientForBackground:
64
- return .locationPermissionsInsufficientForBackground
65
- case .locationPermissionsRestricted:
66
- return .locationPermissionsRestricted
67
- case .locationPermissionsReducedAccuracy:
68
- return .locationPermissionsReducedAccuracy
69
- case .locationPermissionsProvisional:
70
- return .locationPermissionsProvisional
71
- case .locationPermissionsDenied:
72
- return .locationPermissionsDenied
73
- case .locationServicesDisabled:
74
- return .locationServicesDisabled
75
- case .motionActivityPermissionsNotDetermined:
76
- return .motionActivityPermissionsNotDetermined
77
- case .motionActivityPermissionsDenied:
78
- return .motionActivityPermissionsDenied
79
- case .motionActivityServicesDisabled:
80
- return .motionActivityServicesDisabled
81
- case .motionActivityServicesUnavailable:
82
- return .motionActivityServicesUnavailable
83
- case .gpsSignalLost:
84
- return .gpsSignalLost
85
- case .locationMocked:
86
- return .locationMocked
87
- case .invalidPublishableKey:
88
- return .invalidPublishableKey
89
- case .blockedFromRunning:
90
- return .blockedFromRunning
91
- default:
92
- preconditionFailure("Unknown error \(error)")
56
+ func deserializeLocation(_ data: [String: Any]) -> Result<HyperTrack.Location, FailureResult> {
57
+ if data[keyType] as? String != typeLocation {
58
+ return .failure(.fatalError(getParseError(data, key: keyType)))
59
+ }
60
+ guard let value = data[keyValue] as? [String: Any] else {
61
+ return .failure(.fatalError(getParseError(data, key: keyValue)))
62
+ }
63
+ guard let latitude = value["latitude"] as? Double else {
64
+ return .failure(.fatalError(getParseError(value, key: "latitude")))
65
+ }
66
+ guard let longitude = value["longitude"] as? Double else {
67
+ return .failure(.fatalError(getParseError(value, key: "longitude")))
93
68
  }
69
+ return .success(.init(latitude: latitude, longitude: longitude))
94
70
  }
95
71
 
96
- func serializeErrors(_ errors: Set<HyperTrack.HyperTrackError>) -> [[String: Any]] {
97
- return errors.map { error in
98
- serializeHyperTrackError(getHyperTrackError(error))
72
+ func deserializeMetadata(_ data: [String: Any]) -> Result<[String: Any], FailureResult> {
73
+ if data[keyType] as? String != typeMetadata {
74
+ return .failure(.fatalError(getParseError(data, key: keyType)))
75
+ }
76
+ guard let value = data[keyValue] as? [String: Any] else {
77
+ return .failure(.fatalError(getParseError(data, key: keyValue)))
78
+ }
79
+ return .success(value)
80
+ }
81
+
82
+ func deserializeName(_ data: [String: Any]) -> Result<String, FailureResult> {
83
+ if data[keyType] as? String != typeName {
84
+ return .failure(.fatalError(getParseError(data, key: keyType)))
85
+ }
86
+ guard let value = data[keyValue] as? String else {
87
+ return .failure(.fatalError(getParseError(data, key: keyValue)))
99
88
  }
89
+ return .success(value)
100
90
  }
101
91
 
102
92
  func serializeDeviceID(_ deviceID: String) -> [String: Any] {
@@ -106,65 +96,78 @@ func serializeDeviceID(_ deviceID: String) -> [String: Any] {
106
96
  ]
107
97
  }
108
98
 
109
- func serializeLocationResult(_ result: Result<HyperTrack.Location, HyperTrack.LocationError>) -> [String: Any] {
110
- switch result {
99
+ func serializeError(_ error: HyperTrack.Error) -> [String: Any] {
100
+ let value: String
101
+ switch error {
102
+ case .blockedFromRunning:
103
+ value = "blockedFromRunning"
104
+ case .invalidPublishableKey:
105
+ value = "invalidPublishableKey"
106
+ case let .location(location):
107
+ switch location {
108
+ case .mocked:
109
+ value = "location.mocked"
110
+ case .servicesDisabled:
111
+ value = "location.servicesDisabled"
112
+ case .signalLost:
113
+ value = "location.signalLost"
114
+ }
115
+ case let .permissions(permissionType):
116
+ switch permissionType {
117
+ case let .location(permission):
118
+ switch permission {
119
+ case .denied:
120
+ value = "permissions.location.denied"
121
+ case .insufficientForBackground:
122
+ value = "permissions.location.insufficientForBackground"
123
+ case .notDetermined:
124
+ value = "permissions.location.notDetermined"
125
+ case .provisional:
126
+ value = "permissions.location.provisional"
127
+ case .reducedAccuracy:
128
+ value = "permissions.location.reducedAccuracy"
129
+ case .restricted:
130
+ value = "permissions.location.restricted"
131
+ }
132
+ }
133
+ }
134
+
135
+ return [
136
+ keyType: typeError,
137
+ keyValue: value,
138
+ ]
139
+ }
140
+
141
+ func serializeIsAvailable(_ isAvailable: Bool) -> [String: Any] {
142
+ return [
143
+ keyType: typeIsAvailable,
144
+ keyValue: isAvailable,
145
+ ]
146
+ }
147
+
148
+ func serializeIsTracking(_ isTracking: Bool) -> [String: Any] {
149
+ return [
150
+ keyType: typeIsTracking,
151
+ keyValue: isTracking,
152
+ ]
153
+ }
154
+
155
+ func serializeLocateResult(_ locateResult: Result<HyperTrack.Location, Set<HyperTrack.Error>>) -> [String: Any] {
156
+ switch locateResult {
111
157
  case let .success(success):
112
158
  return [
113
159
  keyType: typeSuccess,
114
- keyValue: [
115
- keyType: typeLocation,
116
- keyValue: [
117
- "latitude": success.latitude,
118
- "longitude": success.longitude,
119
- ],
120
- ],
160
+ keyValue: serializeLocation(success),
121
161
  ]
122
162
  case let .failure(failure):
123
- var locationError: [String: Any]
124
- switch failure {
125
- case .locationPermissionsNotDetermined:
126
- locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.locationPermissionsNotDetermined)
127
- case .locationPermissionsCantBeAskedInBackground:
128
- locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.locationPermissionsNotDetermined)
129
- case .locationPermissionsInsufficientForBackground:
130
- locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.locationPermissionsInsufficientForBackground)
131
- case .locationPermissionsRestricted:
132
- locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.locationPermissionsRestricted)
133
- case .locationPermissionsReducedAccuracy:
134
- locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.locationPermissionsReducedAccuracy)
135
- case .locationPermissionsDenied:
136
- locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.locationPermissionsDenied)
137
- case .locationServicesDisabled:
138
- locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.locationServicesDisabled)
139
- case .motionActivityPermissionsNotDetermined:
140
- locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.motionActivityPermissionsNotDetermined)
141
- case .motionActivityPermissionsCantBeAskedInBackground:
142
- locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.motionActivityPermissionsNotDetermined)
143
- case .motionActivityPermissionsDenied:
144
- locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.motionActivityPermissionsDenied)
145
- case .motionActivityServicesDisabled:
146
- locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.motionActivityServicesDisabled)
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
163
  return [
161
164
  keyType: typeFailure,
162
- keyValue: locationError,
165
+ keyValue: serializeErrors(failure),
163
166
  ]
164
167
  }
165
168
  }
166
169
 
167
- private func serializeLocation(_ location: HyperTrack.Location) -> [String: Any] {
170
+ func serializeLocation(_ location: HyperTrack.Location) -> [String: Any] {
168
171
  return [
169
172
  keyType: typeLocation,
170
173
  keyValue: [
@@ -174,49 +177,30 @@ private func serializeLocation(_ location: HyperTrack.Location) -> [String: Any]
174
177
  ]
175
178
  }
176
179
 
177
- func serializeLocationResult(_ result: Result<HyperTrack.Location, HyperTrack.NoLocationError>) -> [String: Any] {
178
- switch result {
179
- case let .success(success):
180
+ func serializeLocationError(_ error: HyperTrack.Location.Error) -> [String: Any] {
181
+ switch error {
182
+ case .starting:
180
183
  return [
181
- keyType: typeSuccess,
182
- keyValue: serializeLocation(success),
184
+ keyType: "starting",
183
185
  ]
184
- case let .failure(failure):
185
- var locationError: [String: Any]
186
- switch failure {
187
- case .starting:
188
- locationError = [
189
- keyType: "starting",
190
- ]
191
- case .notRunning:
192
- locationError = [
193
- keyType: "notRunning",
194
- ]
195
- case let .errors(errors):
196
- locationError = [
197
- keyType: "errors",
198
- keyValue: serializeErrors(errors),
199
- ]
200
- }
201
-
186
+ case .notRunning:
202
187
  return [
203
- keyType: typeFailure,
204
- keyValue: locationError,
188
+ keyType: "notRunning",
189
+ ]
190
+ case let .errors(errors):
191
+ return [
192
+ keyType: "errors",
193
+ keyValue: serializeErrors(errors),
205
194
  ]
206
195
  }
207
196
  }
208
197
 
209
- func serializeExpectedLocationResult(
210
- _ result: Result<HyperTrack.LocationWithDeviation, HyperTrack.NoLocationError>
211
- ) -> [String: Any] {
198
+ func serializeLocationResult(_ result: Result<HyperTrack.Location, HyperTrack.Location.Error>) -> [String: Any] {
212
199
  switch result {
213
200
  case let .success(success):
214
201
  return [
215
202
  keyType: typeSuccess,
216
- keyValue: [
217
- keyType: "locationWithDeviation",
218
- keyValue: serializeLocationWithDeviation(success),
219
- ],
203
+ keyValue: serializeLocation(success),
220
204
  ]
221
205
  case let .failure(failure):
222
206
  return [
@@ -226,24 +210,6 @@ func serializeExpectedLocationResult(
226
210
  }
227
211
  }
228
212
 
229
- func serializeLocationError(_ error: HyperTrack.NoLocationError) -> [String: Any] {
230
- switch error {
231
- case .starting:
232
- return [
233
- keyType: "starting",
234
- ]
235
- case .notRunning:
236
- return [
237
- keyType: "notRunning",
238
- ]
239
- case let .errors(errors):
240
- return [
241
- keyType: "errors",
242
- keyValue: serializeErrors(errors),
243
- ]
244
- }
245
- }
246
-
247
213
  func serializeLocationWithDeviation(
248
214
  _ locationWithDeviation: HyperTrack.LocationWithDeviation
249
215
  ) -> [String: Any] {
@@ -253,95 +219,84 @@ func serializeLocationWithDeviation(
253
219
  ]
254
220
  }
255
221
 
256
- func serializeHyperTrackErrorAsLocationError(_ error: HyperTrackError) -> [String: Any] {
257
- return [
258
- keyType: "errors",
259
- keyValue: [
260
- [
261
- keyType: typeHyperTrackError,
262
- keyValue: error.rawValue,
222
+ func serializeLocationWithDeviationResult(
223
+ _ result: Result<HyperTrack.LocationWithDeviation, HyperTrack.Location.Error>
224
+ ) -> [String: Any] {
225
+ switch result {
226
+ case let .success(success):
227
+ return [
228
+ keyType: typeSuccess,
229
+ keyValue: [
230
+ keyType: "locationWithDeviation",
231
+ keyValue: serializeLocationWithDeviation(success),
263
232
  ],
264
- ],
265
- ]
266
- }
267
-
268
- func serializeHyperTrackError(_ error: HyperTrackError) -> [String: Any] {
269
- return [
270
- keyType: typeHyperTrackError,
271
- keyValue: error.rawValue,
272
- ]
233
+ ]
234
+ case let .failure(failure):
235
+ return [
236
+ keyType: typeFailure,
237
+ keyValue: serializeLocationError(failure),
238
+ ]
239
+ }
273
240
  }
274
241
 
275
- func serializeIsTracking(_ isTracking: Bool) -> [String: Any] {
242
+ func serializeMetadata(_ metadata: HyperTrack.JSON.Object) -> [String: Any] {
276
243
  return [
277
- keyType: typeIsTracking,
278
- keyValue: isTracking,
244
+ keyType: typeMetadata,
245
+ keyValue: toMap(metadata),
279
246
  ]
280
247
  }
281
248
 
282
- func serializeIsAvailable(_ isAvailable: HyperTrack.Availability) -> [String: Any] {
249
+ func serializeName(_ name: String) -> [String: Any] {
283
250
  return [
284
- keyType: typeIsAvailable,
285
- keyValue: isAvailable == .available,
251
+ keyType: typeName,
252
+ keyValue: name,
286
253
  ]
287
254
  }
288
255
 
289
- func deserializeDeviceName(_ data: [String: Any]) -> Result<String, FailureResult> {
290
- if data[keyType] as? String != "deviceName" {
291
- return .failure(.fatalError(getParseError(data, key: keyType)))
292
- }
293
- guard let value = data[keyValue] as? String else {
294
- return .failure(.fatalError(getParseError(data, key: keyValue)))
295
- }
296
- return .success(value)
297
- }
298
-
299
- func deserializeAvailability(_ data: [String: Any]) -> Result<Bool, FailureResult> {
300
- if data[keyType] as? String != typeIsAvailable {
301
- return .failure(.fatalError(getParseError(data, key: keyType)))
302
- }
303
- guard let value = data[keyValue] as? Bool else {
304
- return .failure(.fatalError(getParseError(data, key: keyValue)))
256
+ func serializeErrors(_ errors: Set<HyperTrack.Error>) -> [[String: Any]] {
257
+ return errors.map { error in
258
+ serializeError(error)
305
259
  }
306
- return .success(value)
307
260
  }
308
261
 
309
- func deserializeGeotagData(
310
- _ args: [String: Any]
311
- ) -> Result<GeotagData, FailureResult> {
312
- guard let data = args[keyGeotagData] as? [String: Any] else {
313
- return .failure(.fatalError(getParseError(args, key: keyGeotagData)))
314
- }
315
- if let expectedLocationData = args[keyExpectedLocation] as? [String: Any] {
316
- let expectedLocation = deserializeLocation(expectedLocationData)
317
- switch expectedLocation {
318
- case let .failure(failure):
319
- return .failure(failure)
320
- case let .success(expectedLocation):
321
- return .success(.init(data: data, expectedLocation: expectedLocation))
262
+ private func toMap(_ object: HyperTrack.JSON.Object) -> [String: Any] {
263
+ return object.mapValues { value in
264
+ switch value {
265
+ case let .object(objectValue):
266
+ return toMap(objectValue) as Any
267
+ case let .array(arr):
268
+ return toArray(arr)
269
+ case let .bool(bool):
270
+ return bool
271
+ case let .number(number):
272
+ return number
273
+ case let .string(string):
274
+ return string
275
+ case .null:
276
+ return NSNull()
322
277
  }
323
- } else {
324
- return .success(.init(data: data, expectedLocation: nil))
325
278
  }
326
279
  }
327
280
 
328
- func deserializeLocation(_ data: [String: Any]) -> Result<HyperTrack.Location, FailureResult> {
329
- if data[keyType] as? String != typeLocation {
330
- return .failure(.fatalError(getParseError(data, key: keyType)))
331
- }
332
- guard let value = data[keyValue] as? [String: Any] else {
333
- return .failure(.fatalError(getParseError(data, key: keyValue)))
334
- }
335
- guard let latitude = value["latitude"] as? Double else {
336
- return .failure(.fatalError(getParseError(value, key: "latitude")))
337
- }
338
- guard let longitude = value["longitude"] as? Double else {
339
- return .failure(.fatalError(getParseError(value, key: "longitude")))
281
+ private func toArray(_ array: [HyperTrack.JSON]) -> [Any] {
282
+ return array.map { (json: HyperTrack.JSON) -> Any in
283
+ switch json {
284
+ case let .object(objectValue):
285
+ return toMap(objectValue)
286
+ case let .array(arr):
287
+ return toArray(arr)
288
+ case let .bool(bool):
289
+ return bool
290
+ case let .number(number):
291
+ return number
292
+ case let .string(string):
293
+ return string
294
+ case .null:
295
+ return NSNull()
296
+ }
340
297
  }
341
-
342
- return .success(HyperTrack.Location(latitude: latitude, longitude: longitude))
343
298
  }
344
299
 
345
- func getParseError(_ data: Any, key: String) -> String {
300
+ private func getParseError(_ data: Any, key: String) -> String {
346
301
  return "Invalid input for key \(key): \(data)"
347
302
  }