hypertrack-sdk-react-native 10.0.3 → 11.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 (70) hide show
  1. package/CHANGELOG.md +48 -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 +44 -80
  17. package/ios/common/SDKMethod.swift +13 -12
  18. package/ios/common/Serialization.swift +190 -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,82 @@
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)))
39
+ }
40
+ guard let value = data[keyValue] as? Bool else {
41
+ return .failure(.fatalError(getParseError(data, key: keyValue)))
25
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 deserializeName(_ data: [String: Any]) -> Result<String, FailureResult> {
73
+ if data[keyType] as? String != typeName {
74
+ return .failure(.fatalError(getParseError(data, key: keyType)))
99
75
  }
76
+ guard let value = data[keyValue] as? String else {
77
+ return .failure(.fatalError(getParseError(data, key: keyValue)))
78
+ }
79
+ return .success(value)
100
80
  }
101
81
 
102
82
  func serializeDeviceID(_ deviceID: String) -> [String: Any] {
@@ -106,65 +86,78 @@ func serializeDeviceID(_ deviceID: String) -> [String: Any] {
106
86
  ]
107
87
  }
108
88
 
109
- func serializeLocationResult(_ result: Result<HyperTrack.Location, HyperTrack.LocationError>) -> [String: Any] {
110
- switch result {
89
+ func serializeError(_ error: HyperTrack.Error) -> [String: Any] {
90
+ let value: String
91
+ switch error {
92
+ case .blockedFromRunning:
93
+ value = "blockedFromRunning"
94
+ case .invalidPublishableKey:
95
+ value = "invalidPublishableKey"
96
+ case let .location(location):
97
+ switch location {
98
+ case .mocked:
99
+ value = "location.mocked"
100
+ case .servicesDisabled:
101
+ value = "location.servicesDisabled"
102
+ case .signalLost:
103
+ value = "location.signalLost"
104
+ }
105
+ case let .permissions(permissionType):
106
+ switch permissionType {
107
+ case let .location(permission):
108
+ switch permission {
109
+ case .denied:
110
+ value = "permissions.location.denied"
111
+ case .insufficientForBackground:
112
+ value = "permissions.location.insufficientForBackground"
113
+ case .notDetermined:
114
+ value = "permissions.location.notDetermined"
115
+ case .provisional:
116
+ value = "permissions.location.provisional"
117
+ case .reducedAccuracy:
118
+ value = "permissions.location.reducedAccuracy"
119
+ case .restricted:
120
+ value = "permissions.location.restricted"
121
+ }
122
+ }
123
+ }
124
+
125
+ return [
126
+ keyType: typeError,
127
+ keyValue: value,
128
+ ]
129
+ }
130
+
131
+ func serializeIsAvailable(_ isAvailable: Bool) -> [String: Any] {
132
+ return [
133
+ keyType: typeIsAvailable,
134
+ keyValue: isAvailable,
135
+ ]
136
+ }
137
+
138
+ func serializeIsTracking(_ isTracking: Bool) -> [String: Any] {
139
+ return [
140
+ keyType: typeIsTracking,
141
+ keyValue: isTracking,
142
+ ]
143
+ }
144
+
145
+ func serializeLocateResult(_ locateResult: Result<HyperTrack.Location, Set<HyperTrack.Error>>) -> [String: Any] {
146
+ switch locateResult {
111
147
  case let .success(success):
112
148
  return [
113
149
  keyType: typeSuccess,
114
- keyValue: [
115
- keyType: typeLocation,
116
- keyValue: [
117
- "latitude": success.latitude,
118
- "longitude": success.longitude,
119
- ],
120
- ],
150
+ keyValue: serializeLocation(success),
121
151
  ]
122
152
  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
153
  return [
161
154
  keyType: typeFailure,
162
- keyValue: locationError,
155
+ keyValue: serializeErrors(failure),
163
156
  ]
164
157
  }
165
158
  }
166
159
 
167
- private func serializeLocation(_ location: HyperTrack.Location) -> [String: Any] {
160
+ func serializeLocation(_ location: HyperTrack.Location) -> [String: Any] {
168
161
  return [
169
162
  keyType: typeLocation,
170
163
  keyValue: [
@@ -174,49 +167,30 @@ private func serializeLocation(_ location: HyperTrack.Location) -> [String: Any]
174
167
  ]
175
168
  }
176
169
 
177
- func serializeLocationResult(_ result: Result<HyperTrack.Location, HyperTrack.NoLocationError>) -> [String: Any] {
178
- switch result {
179
- case let .success(success):
170
+ func serializeLocationError(_ error: HyperTrack.Location.Error) -> [String: Any] {
171
+ switch error {
172
+ case .starting:
180
173
  return [
181
- keyType: typeSuccess,
182
- keyValue: serializeLocation(success),
174
+ keyType: "starting",
183
175
  ]
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
-
176
+ case .notRunning:
202
177
  return [
203
- keyType: typeFailure,
204
- keyValue: locationError,
178
+ keyType: "notRunning",
179
+ ]
180
+ case let .errors(errors):
181
+ return [
182
+ keyType: "errors",
183
+ keyValue: serializeErrors(errors),
205
184
  ]
206
185
  }
207
186
  }
208
187
 
209
- func serializeExpectedLocationResult(
210
- _ result: Result<HyperTrack.LocationWithDeviation, HyperTrack.NoLocationError>
211
- ) -> [String: Any] {
188
+ func serializeLocationResult(_ result: Result<HyperTrack.Location, HyperTrack.Location.Error>) -> [String: Any] {
212
189
  switch result {
213
190
  case let .success(success):
214
191
  return [
215
192
  keyType: typeSuccess,
216
- keyValue: [
217
- keyType: "locationWithDeviation",
218
- keyValue: serializeLocationWithDeviation(success),
219
- ],
193
+ keyValue: serializeLocation(success),
220
194
  ]
221
195
  case let .failure(failure):
222
196
  return [
@@ -226,24 +200,6 @@ func serializeExpectedLocationResult(
226
200
  }
227
201
  }
228
202
 
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
203
  func serializeLocationWithDeviation(
248
204
  _ locationWithDeviation: HyperTrack.LocationWithDeviation
249
205
  ) -> [String: Any] {
@@ -253,95 +209,84 @@ func serializeLocationWithDeviation(
253
209
  ]
254
210
  }
255
211
 
256
- func serializeHyperTrackErrorAsLocationError(_ error: HyperTrackError) -> [String: Any] {
257
- return [
258
- keyType: "errors",
259
- keyValue: [
260
- [
261
- keyType: typeHyperTrackError,
262
- keyValue: error.rawValue,
212
+ func serializeLocationWithDeviationResult(
213
+ _ result: Result<HyperTrack.LocationWithDeviation, HyperTrack.Location.Error>
214
+ ) -> [String: Any] {
215
+ switch result {
216
+ case let .success(success):
217
+ return [
218
+ keyType: typeSuccess,
219
+ keyValue: [
220
+ keyType: "locationWithDeviation",
221
+ keyValue: serializeLocationWithDeviation(success),
263
222
  ],
264
- ],
265
- ]
266
- }
267
-
268
- func serializeHyperTrackError(_ error: HyperTrackError) -> [String: Any] {
269
- return [
270
- keyType: typeHyperTrackError,
271
- keyValue: error.rawValue,
272
- ]
223
+ ]
224
+ case let .failure(failure):
225
+ return [
226
+ keyType: typeFailure,
227
+ keyValue: serializeLocationError(failure),
228
+ ]
229
+ }
273
230
  }
274
231
 
275
- func serializeIsTracking(_ isTracking: Bool) -> [String: Any] {
232
+ func serializeMetadata(_ metadata: HyperTrack.JSON.Object) -> [String: Any] {
276
233
  return [
277
- keyType: typeIsTracking,
278
- keyValue: isTracking,
234
+ keyType: typeMetadata,
235
+ keyValue: toMap(metadata),
279
236
  ]
280
237
  }
281
238
 
282
- func serializeIsAvailable(_ isAvailable: HyperTrack.Availability) -> [String: Any] {
239
+ func serializeName(_ name: String) -> [String: Any] {
283
240
  return [
284
- keyType: typeIsAvailable,
285
- keyValue: isAvailable == .available,
241
+ keyType: typeName,
242
+ keyValue: name,
286
243
  ]
287
244
  }
288
245
 
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)))
246
+ func serializeErrors(_ errors: Set<HyperTrack.Error>) -> [[String: Any]] {
247
+ return errors.map { error in
248
+ serializeError(error)
305
249
  }
306
- return .success(value)
307
250
  }
308
251
 
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))
252
+ private func toMap(_ object: HyperTrack.JSON.Object) -> [String: Any] {
253
+ return object.mapValues { value in
254
+ switch value {
255
+ case let .object(objectValue):
256
+ return toMap(objectValue) as Any
257
+ case let .array(arr):
258
+ return toArray(arr)
259
+ case let .bool(bool):
260
+ return bool
261
+ case let .number(number):
262
+ return number
263
+ case let .string(string):
264
+ return string
265
+ case .null:
266
+ return NSNull()
322
267
  }
323
- } else {
324
- return .success(.init(data: data, expectedLocation: nil))
325
268
  }
326
269
  }
327
270
 
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")))
271
+ private func toArray(_ array: [HyperTrack.JSON]) -> [Any] {
272
+ return array.map { (json: HyperTrack.JSON) -> Any in
273
+ switch json {
274
+ case let .object(objectValue):
275
+ return toMap(objectValue)
276
+ case let .array(arr):
277
+ return toArray(arr)
278
+ case let .bool(bool):
279
+ return bool
280
+ case let .number(number):
281
+ return number
282
+ case let .string(string):
283
+ return string
284
+ case .null:
285
+ return NSNull()
286
+ }
340
287
  }
341
-
342
- return .success(HyperTrack.Location(latitude: latitude, longitude: longitude))
343
288
  }
344
289
 
345
- func getParseError(_ data: Any, key: String) -> String {
290
+ private func getParseError(_ data: Any, key: String) -> String {
346
291
  return "Invalid input for key \(key): \(data)"
347
292
  }