react-native-candle 0.1.43 → 0.1.44

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 (160) hide show
  1. package/ReactNativeCandle.podspec +1 -1
  2. package/ios/Sources/CandleActionViewModel.swift +4 -7
  3. package/ios/Sources/CandleLinkSheetWrapperView.swift +40 -59
  4. package/ios/Sources/CandleLinkViewModel.swift +21 -31
  5. package/ios/Sources/CandleTradeExecutionSheetWrapper.swift +14 -23
  6. package/ios/Sources/HostingViewController.swift +26 -26
  7. package/ios/Sources/RNCandle.swift +159 -1307
  8. package/ios/Sources/Types.swift +847 -0
  9. package/ios/Sources/UIApplication++.swift +5 -9
  10. package/lib/commonjs/context.js +17 -0
  11. package/lib/commonjs/context.js.map +1 -0
  12. package/lib/commonjs/index.js +17 -407
  13. package/lib/commonjs/index.js.map +1 -1
  14. package/lib/commonjs/package.json +1 -0
  15. package/lib/commonjs/provider.js +117 -0
  16. package/lib/commonjs/provider.js.map +1 -0
  17. package/lib/commonjs/types.js +271 -0
  18. package/lib/commonjs/types.js.map +1 -0
  19. package/lib/module/context.js +12 -0
  20. package/lib/module/context.js.map +1 -0
  21. package/lib/module/index.js +2 -408
  22. package/lib/module/index.js.map +1 -1
  23. package/lib/module/package.json +1 -0
  24. package/lib/module/provider.js +111 -0
  25. package/lib/module/provider.js.map +1 -0
  26. package/lib/module/types.js +256 -0
  27. package/lib/module/types.js.map +1 -0
  28. package/lib/typescript/commonjs/src/context.d.ts +47 -0
  29. package/lib/typescript/commonjs/src/context.d.ts.map +1 -0
  30. package/lib/typescript/commonjs/src/index.d.ts +4 -166
  31. package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
  32. package/lib/typescript/commonjs/src/provider.d.ts +8 -0
  33. package/lib/typescript/commonjs/src/provider.d.ts.map +1 -0
  34. package/lib/typescript/commonjs/src/specs/RNCandle.nitro.d.ts +22 -24
  35. package/lib/typescript/commonjs/src/specs/RNCandle.nitro.d.ts.map +1 -1
  36. package/lib/typescript/commonjs/src/types.d.ts +125 -0
  37. package/lib/typescript/commonjs/src/types.d.ts.map +1 -0
  38. package/lib/typescript/module/src/context.d.ts +47 -0
  39. package/lib/typescript/module/src/context.d.ts.map +1 -0
  40. package/lib/typescript/module/src/index.d.ts +4 -166
  41. package/lib/typescript/module/src/index.d.ts.map +1 -1
  42. package/lib/typescript/module/src/provider.d.ts +8 -0
  43. package/lib/typescript/module/src/provider.d.ts.map +1 -0
  44. package/lib/typescript/module/src/specs/RNCandle.nitro.d.ts +22 -24
  45. package/lib/typescript/module/src/specs/RNCandle.nitro.d.ts.map +1 -1
  46. package/lib/typescript/module/src/types.d.ts +125 -0
  47. package/lib/typescript/module/src/types.d.ts.map +1 -0
  48. package/nitrogen/generated/.gitattributes +1 -1
  49. package/nitrogen/generated/ios/ReactNativeCandle-Swift-Cxx-Bridge.cpp +15 -31
  50. package/nitrogen/generated/ios/ReactNativeCandle-Swift-Cxx-Bridge.hpp +379 -242
  51. package/nitrogen/generated/ios/ReactNativeCandle-Swift-Cxx-Umbrella.hpp +23 -22
  52. package/nitrogen/generated/ios/ReactNativeCandleAutolinking.mm +1 -1
  53. package/nitrogen/generated/ios/ReactNativeCandleAutolinking.swift +2 -4
  54. package/nitrogen/generated/ios/c++/HybridRNCandleSpecSwift.hpp +36 -42
  55. package/nitrogen/generated/ios/swift/ActiveLinkedAccountDetails.swift +6 -3
  56. package/nitrogen/generated/ios/swift/AssetAccount.swift +6 -3
  57. package/nitrogen/generated/ios/swift/AssetAccountKind.swift +4 -4
  58. package/nitrogen/generated/ios/swift/AssetAccountRef.swift +5 -5
  59. package/nitrogen/generated/ios/swift/{AssetAccountQuery.swift → AssetAccountsQuery.swift} +7 -6
  60. package/nitrogen/generated/ios/swift/Counterparty.swift +8 -3
  61. package/nitrogen/generated/ios/swift/CounterpartyKind.swift +42 -0
  62. package/nitrogen/generated/ios/swift/FiatAccount.swift +4 -2
  63. package/nitrogen/generated/ios/swift/FiatAsset.swift +2 -1
  64. package/nitrogen/generated/ios/swift/FiatAssetQuoteRequest.swift +4 -2
  65. package/nitrogen/generated/ios/swift/FiatAssetRef.swift +2 -1
  66. package/nitrogen/generated/ios/swift/Func_void_LinkedAccount.swift +5 -5
  67. package/nitrogen/generated/ios/swift/HybridRNCandleSpec.swift +7 -7
  68. package/nitrogen/generated/ios/swift/HybridRNCandleSpec_cxx.swift +40 -65
  69. package/nitrogen/generated/ios/swift/LinkedAccountDetails.swift +15 -3
  70. package/nitrogen/generated/ios/swift/{StatePayload.swift → LinkedAccountState.swift} +6 -6
  71. package/nitrogen/generated/ios/swift/LinkedAccountStatusRef.swift +4 -3
  72. package/nitrogen/generated/ios/swift/MarketAccount.swift +5 -5
  73. package/nitrogen/generated/ios/swift/MarketAssetKind.swift +38 -0
  74. package/nitrogen/generated/ios/swift/MarketAssetQuoteRequest.swift +11 -8
  75. package/nitrogen/generated/ios/swift/MarketTradeAsset.swift +7 -7
  76. package/nitrogen/generated/ios/swift/MarketTradeAssetRef.swift +5 -5
  77. package/nitrogen/generated/ios/swift/MerchantCounterparty.swift +2 -1
  78. package/nitrogen/generated/ios/swift/TradeAsset.swift +10 -5
  79. package/nitrogen/generated/ios/swift/TradeAssetKind.swift +54 -0
  80. package/nitrogen/generated/ios/swift/TradeAssetQuoteRequest.swift +15 -4
  81. package/nitrogen/generated/ios/swift/TradeAssetRef.swift +11 -5
  82. package/nitrogen/generated/ios/swift/TradeExecutionResult.swift +4 -2
  83. package/nitrogen/generated/ios/swift/{TradeQuoteRequest.swift → TradeQuotesRequest.swift} +7 -6
  84. package/nitrogen/generated/ios/swift/{TradeQuery.swift → TradesQuery.swift} +29 -45
  85. package/nitrogen/generated/ios/swift/TransportAssetQuoteRequest.swift +12 -6
  86. package/nitrogen/generated/shared/c++/ACHAccountKind.hpp +7 -9
  87. package/nitrogen/generated/shared/c++/ACHDetails.hpp +7 -9
  88. package/nitrogen/generated/shared/c++/ActiveLinkedAccountDetails.hpp +4 -6
  89. package/nitrogen/generated/shared/c++/Address.hpp +4 -6
  90. package/nitrogen/generated/shared/c++/AssetAccount.hpp +14 -16
  91. package/nitrogen/generated/shared/c++/AssetAccountKind.hpp +15 -17
  92. package/nitrogen/generated/shared/c++/AssetAccountRef.hpp +12 -12
  93. package/nitrogen/generated/shared/c++/{AssetAccountQuery.hpp → AssetAccountsQuery.hpp} +14 -16
  94. package/nitrogen/generated/shared/c++/AssetAccountsResponse.hpp +11 -13
  95. package/nitrogen/generated/shared/c++/Coordinates.hpp +4 -6
  96. package/nitrogen/generated/shared/c++/Counterparty.hpp +14 -16
  97. package/nitrogen/generated/shared/c++/CounterpartyKind.hpp +80 -0
  98. package/nitrogen/generated/shared/c++/FiatAccount.hpp +16 -18
  99. package/nitrogen/generated/shared/c++/FiatAsset.hpp +7 -9
  100. package/nitrogen/generated/shared/c++/FiatAssetQuoteRequest.hpp +4 -6
  101. package/nitrogen/generated/shared/c++/FiatAssetRef.hpp +4 -6
  102. package/nitrogen/generated/shared/c++/FiatMarketAccountKind.hpp +13 -15
  103. package/nitrogen/generated/shared/c++/HybridRNCandleSpec.cpp +1 -2
  104. package/nitrogen/generated/shared/c++/HybridRNCandleSpec.hpp +17 -27
  105. package/nitrogen/generated/shared/c++/InactiveLinkedAccountDetails.hpp +4 -6
  106. package/nitrogen/generated/shared/c++/LinkedAccount.hpp +10 -12
  107. package/nitrogen/generated/shared/c++/LinkedAccountDetails.hpp +14 -16
  108. package/nitrogen/generated/shared/c++/LinkedAccountRef.hpp +4 -6
  109. package/nitrogen/generated/shared/c++/{StatePayload.hpp → LinkedAccountState.hpp} +15 -17
  110. package/nitrogen/generated/shared/c++/LinkedAccountStatusRef.hpp +15 -17
  111. package/nitrogen/generated/shared/c++/MarketAccount.hpp +18 -17
  112. package/nitrogen/generated/shared/c++/MarketAssetKind.hpp +76 -0
  113. package/nitrogen/generated/shared/c++/MarketAssetQuoteRequest.hpp +12 -12
  114. package/nitrogen/generated/shared/c++/MarketTradeAsset.hpp +15 -14
  115. package/nitrogen/generated/shared/c++/MarketTradeAssetRef.hpp +12 -12
  116. package/nitrogen/generated/shared/c++/MerchantCounterparty.hpp +8 -10
  117. package/nitrogen/generated/shared/c++/MerchantLocation.hpp +4 -6
  118. package/nitrogen/generated/shared/c++/NothingAsset.hpp +4 -6
  119. package/nitrogen/generated/shared/c++/NothingAssetQuoteRequest.hpp +4 -6
  120. package/nitrogen/generated/shared/c++/NothingAssetRef.hpp +4 -6
  121. package/nitrogen/generated/shared/c++/OtherAsset.hpp +4 -6
  122. package/nitrogen/generated/shared/c++/OtherAssetRef.hpp +4 -6
  123. package/nitrogen/generated/shared/c++/PresentationBackground.hpp +7 -9
  124. package/nitrogen/generated/shared/c++/PresentationStyle.hpp +7 -9
  125. package/nitrogen/generated/shared/c++/Service.hpp +163 -165
  126. package/nitrogen/generated/shared/c++/ServiceCounterparty.hpp +7 -9
  127. package/nitrogen/generated/shared/c++/Trade.hpp +16 -18
  128. package/nitrogen/generated/shared/c++/TradeAsset.hpp +20 -22
  129. package/nitrogen/generated/shared/c++/TradeAssetKind.hpp +92 -0
  130. package/nitrogen/generated/shared/c++/TradeAssetQuoteRequest.hpp +17 -19
  131. package/nitrogen/generated/shared/c++/TradeAssetRef.hpp +20 -22
  132. package/nitrogen/generated/shared/c++/TradeExecutionResult.hpp +8 -10
  133. package/nitrogen/generated/shared/c++/TradeQuote.hpp +10 -12
  134. package/nitrogen/generated/shared/c++/{TradeQuoteRequest.hpp → TradeQuotesRequest.hpp} +17 -19
  135. package/nitrogen/generated/shared/c++/TradeQuotesResponse.hpp +11 -13
  136. package/nitrogen/generated/shared/c++/TradeRef.hpp +10 -12
  137. package/nitrogen/generated/shared/c++/TradeState.hpp +9 -11
  138. package/nitrogen/generated/shared/c++/TradesQuery.hpp +89 -0
  139. package/nitrogen/generated/shared/c++/TradesResponse.hpp +11 -13
  140. package/nitrogen/generated/shared/c++/TransportAccount.hpp +10 -12
  141. package/nitrogen/generated/shared/c++/TransportAccountKind.hpp +9 -11
  142. package/nitrogen/generated/shared/c++/TransportAsset.hpp +19 -21
  143. package/nitrogen/generated/shared/c++/TransportAssetQuoteRequest.hpp +16 -18
  144. package/nitrogen/generated/shared/c++/TransportAssetRef.hpp +4 -6
  145. package/nitrogen/generated/shared/c++/UnavailableLinkedAccountDetails.hpp +4 -6
  146. package/nitrogen/generated/shared/c++/UserCounterparty.hpp +4 -6
  147. package/nitrogen/generated/shared/c++/WireDetails.hpp +4 -6
  148. package/package.json +9 -11
  149. package/src/context.ts +86 -0
  150. package/src/index.ts +4 -634
  151. package/src/provider.tsx +152 -0
  152. package/src/specs/RNCandle.nitro.ts +38 -29
  153. package/src/types.ts +462 -0
  154. package/nitrogen/generated/ios/swift/AppUser.swift +0 -75
  155. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +0 -44
  156. package/nitrogen/generated/ios/swift/Func_void_std__vector_std__shared_ptr_AnyMap__.swift +0 -47
  157. package/nitrogen/generated/ios/swift/ToolCall.swift +0 -44
  158. package/nitrogen/generated/shared/c++/AppUser.hpp +0 -78
  159. package/nitrogen/generated/shared/c++/ToolCall.hpp +0 -73
  160. package/nitrogen/generated/shared/c++/TradeQuery.hpp +0 -86
@@ -0,0 +1,847 @@
1
+ import Candle
2
+
3
+ enum CandleError: Swift.Error { case unexpected(message: String) }
4
+
5
+ // MARK: Encoding & decoding
6
+
7
+ extension Models.MarketTradeAsset.AssetKindPayload {
8
+ init(reactModel: MarketAssetKind) {
9
+ switch reactModel {
10
+ case .crypto: self = .crypto
11
+ case .stock: self = .stock
12
+ }
13
+ }
14
+ var reactModel: MarketAssetKind {
15
+ switch self {
16
+ case .crypto: return .crypto
17
+ case .stock: return .stock
18
+ }
19
+ }
20
+ }
21
+
22
+ extension Models.Address {
23
+ init(reactModel: Address) { self.init(value: reactModel.value) }
24
+ var reactModel: Address { .init(value: value) }
25
+ }
26
+
27
+ extension Models.Coordinates {
28
+ init(reactModel: Coordinates) {
29
+ self.init(latitude: reactModel.latitude, longitude: reactModel.longitude)
30
+ }
31
+ var reactModel: Coordinates { .init(latitude: latitude, longitude: longitude) }
32
+ }
33
+
34
+ extension Models.Service {
35
+ init(reactModel: Service) {
36
+ switch reactModel {
37
+ case .apple: self = .apple
38
+ case .cashApp: self = .cashApp
39
+ case .sandbox: self = .sandbox
40
+ case .robinhood: self = .robinhood
41
+ case .uber: self = .uber
42
+ case .lyft: self = .lyft
43
+ case .venmo: self = .venmo
44
+ case .chime: self = .chime
45
+ case .paypal: self = .paypal
46
+ case .coinbase: self = .coinbase
47
+ case .discover: self = .discover
48
+ case .americanExpress: self = .americanExpress
49
+ case .jpmorganChase: self = .jpmorganChase
50
+ case .bankOfAmerica: self = .bankOfAmerica
51
+ case .capitalOne: self = .capitalOne
52
+ case .citibank: self = .citibank
53
+ case .vanguard: self = .vanguard
54
+ case .wellsFargo: self = .wellsFargo
55
+ case .charlesSchwab: self = .charlesSchwab
56
+ case .kalshi: self = .kalshi
57
+ case .experian: self = .experian
58
+ case .waymo: self = .waymo
59
+ case .revel: self = .revel
60
+ case .turo: self = .turo
61
+ case .getaround: self = .getaround
62
+ case .zipcar: self = .zipcar
63
+ case .airbnb: self = .airbnb
64
+ case .americanAirlines: self = .americanAirlines
65
+ case .delta: self = .delta
66
+ case .united: self = .united
67
+ case .jetblue: self = .jetblue
68
+ case .southwest: self = .southwest
69
+ case .hawaiian: self = .hawaiian
70
+ case .hotels: self = .hotels
71
+ case .geico: self = .geico
72
+ case .progressive: self = .progressive
73
+ case .aaa: self = .aaa
74
+ case .stateFarm: self = .stateFarm
75
+ case .hertz: self = .hertz
76
+ case .avis: self = .avis
77
+ case .tesla: self = .tesla
78
+ case .doordash: self = .doordash
79
+ case .uberEats: self = .uberEats
80
+ case .grubhub: self = .grubhub
81
+ case .resy: self = .resy
82
+ case .opentable: self = .opentable
83
+ case .starbucks: self = .starbucks
84
+ case .blueBottle: self = .blueBottle
85
+ case .costco: self = .costco
86
+ case .amazon: self = .amazon
87
+ case .walmart: self = .walmart
88
+ case .wholeFoods: self = .wholeFoods
89
+ case .mcdonalds: self = .mcdonalds
90
+ case .chipotle: self = .chipotle
91
+ case .sweetgreen: self = .sweetgreen
92
+ case .snapchat: self = .snapchat
93
+ case .x: self = .x
94
+ case .facebook: self = .facebook
95
+ case .instagram: self = .instagram
96
+ case .signal: self = .signal
97
+ case .whatsapp: self = .whatsapp
98
+ case .messenger: self = .messenger
99
+ case .linkedin: self = .linkedin
100
+ case .discord: self = .discord
101
+ case .messages: self = .messages
102
+ case .telegram: self = .telegram
103
+ case .reddit: self = .reddit
104
+ case .pinterest: self = .pinterest
105
+ case .newYorkTimes: self = .newYorkTimes
106
+ case .washingtonPost: self = .washingtonPost
107
+ case .wallStreetJournal: self = .wallStreetJournal
108
+ case .cnn: self = .cnn
109
+ case .yahoo: self = .yahoo
110
+ case .fox: self = .fox
111
+ case .perplexity: self = .perplexity
112
+ case .openai: self = .openai
113
+ case .polymarket: self = .polymarket
114
+ case .espn: self = .espn
115
+ case .youtube: self = .youtube
116
+ case .netflix: self = .netflix
117
+ }
118
+ }
119
+ var reactModel: Service {
120
+ switch self {
121
+ case .apple: return .apple
122
+ case .cashApp: return .cashApp
123
+ case .sandbox: return .sandbox
124
+ case .robinhood: return .robinhood
125
+ case .uber: return .uber
126
+ case .lyft: return .lyft
127
+ case .venmo: return .venmo
128
+ case .chime: return .chime
129
+ case .paypal: return .paypal
130
+ case .coinbase: return .coinbase
131
+ case .discover: return .discover
132
+ case .americanExpress: return .americanExpress
133
+ case .jpmorganChase: return .jpmorganChase
134
+ case .bankOfAmerica: return .bankOfAmerica
135
+ case .capitalOne: return .capitalOne
136
+ case .citibank: return .citibank
137
+ case .vanguard: return .vanguard
138
+ case .wellsFargo: return .wellsFargo
139
+ case .charlesSchwab: return .charlesSchwab
140
+ case .kalshi: return .kalshi
141
+ case .experian: return .experian
142
+ case .waymo: return .waymo
143
+ case .revel: return .revel
144
+ case .turo: return .turo
145
+ case .getaround: return .getaround
146
+ case .zipcar: return .zipcar
147
+ case .airbnb: return .airbnb
148
+ case .americanAirlines: return .americanAirlines
149
+ case .delta: return .delta
150
+ case .united: return .united
151
+ case .jetblue: return .jetblue
152
+ case .southwest: return .southwest
153
+ case .hawaiian: return .hawaiian
154
+ case .hotels: return .hotels
155
+ case .geico: return .geico
156
+ case .progressive: return .progressive
157
+ case .aaa: return .aaa
158
+ case .stateFarm: return .stateFarm
159
+ case .hertz: return .hertz
160
+ case .avis: return .avis
161
+ case .tesla: return .tesla
162
+ case .doordash: return .doordash
163
+ case .uberEats: return .uberEats
164
+ case .grubhub: return .grubhub
165
+ case .resy: return .resy
166
+ case .opentable: return .opentable
167
+ case .starbucks: return .starbucks
168
+ case .blueBottle: return .blueBottle
169
+ case .costco: return .costco
170
+ case .amazon: return .amazon
171
+ case .walmart: return .walmart
172
+ case .wholeFoods: return .wholeFoods
173
+ case .mcdonalds: return .mcdonalds
174
+ case .chipotle: return .chipotle
175
+ case .sweetgreen: return .sweetgreen
176
+ case .snapchat: return .snapchat
177
+ case .x: return .x
178
+ case .facebook: return .facebook
179
+ case .instagram: return .instagram
180
+ case .signal: return .signal
181
+ case .whatsapp: return .whatsapp
182
+ case .messenger: return .messenger
183
+ case .linkedin: return .linkedin
184
+ case .discord: return .discord
185
+ case .messages: return .messages
186
+ case .telegram: return .telegram
187
+ case .reddit: return .reddit
188
+ case .pinterest: return .pinterest
189
+ case .newYorkTimes: return .newYorkTimes
190
+ case .washingtonPost: return .washingtonPost
191
+ case .wallStreetJournal: return .wallStreetJournal
192
+ case .cnn: return .cnn
193
+ case .yahoo: return .yahoo
194
+ case .fox: return .fox
195
+ case .perplexity: return .perplexity
196
+ case .openai: return .openai
197
+ case .polymarket: return .polymarket
198
+ case .espn: return .espn
199
+ case .youtube: return .youtube
200
+ case .netflix: return .netflix
201
+ }
202
+ }
203
+ }
204
+
205
+ extension Models.TradeAsset {
206
+ init(reactModel: TradeAsset) throws {
207
+ if let fiatAsset = reactModel.fiatAsset {
208
+ self = .FiatAsset(
209
+ .init(
210
+ assetKind: .fiat,
211
+ serviceTradeID: fiatAsset.serviceTradeID,
212
+ serviceAccountID: fiatAsset.serviceAccountID,
213
+ currencyCode: fiatAsset.currencyCode,
214
+ amount: fiatAsset.amount,
215
+ linkedAccountID: fiatAsset.linkedAccountID,
216
+ service: .init(reactModel: fiatAsset.service)
217
+ )
218
+ )
219
+ } else if let marketAsset = reactModel.marketTradeAsset {
220
+ self = .MarketTradeAsset(
221
+ .init(
222
+ assetKind: .init(reactModel: marketAsset.assetKind),
223
+ serviceAccountID: marketAsset.serviceAccountID,
224
+ serviceAssetID: marketAsset.serviceAssetID,
225
+ symbol: marketAsset.symbol,
226
+ amount: marketAsset.amount,
227
+ serviceTradeID: marketAsset.serviceTradeID,
228
+ linkedAccountID: marketAsset.linkedAccountID,
229
+ service: .init(reactModel: marketAsset.service),
230
+ name: marketAsset.name,
231
+ color: marketAsset.color,
232
+ logoURL: marketAsset.logoURL
233
+ )
234
+ )
235
+ } else if let transportAsset = reactModel.transportAsset {
236
+ self = .TransportAsset(
237
+ .init(
238
+ assetKind: .transport,
239
+ serviceTradeID: transportAsset.serviceTradeID,
240
+ serviceAssetID: transportAsset.serviceAssetID,
241
+ serviceAccountID: transportAsset.serviceAccountID,
242
+ name: transportAsset.name,
243
+ description: transportAsset.description,
244
+ imageURL: transportAsset.imageURL,
245
+ originCoordinates: .init(reactModel: transportAsset.originCoordinates),
246
+ originAddress: .init(reactModel: transportAsset.originAddress),
247
+ destinationCoordinates: .init(
248
+ reactModel: transportAsset.destinationCoordinates
249
+ ),
250
+ destinationAddress: .init(reactModel: transportAsset.destinationAddress),
251
+ seats: transportAsset.seats,
252
+ departureDateTime: transportAsset.departureDateTime,
253
+ arrivalDateTime: transportAsset.arrivalDateTime,
254
+ linkedAccountID: transportAsset.linkedAccountID,
255
+ service: .init(reactModel: transportAsset.service)
256
+ )
257
+ )
258
+ } else if reactModel.otherAsset != nil {
259
+ self = .OtherAsset(.init(assetKind: .other))
260
+ } else if reactModel.nothingAsset != nil {
261
+ self = .NothingAsset(.init(assetKind: .nothing))
262
+ } else {
263
+ throw CandleError.unexpected(
264
+ message: "Internal Candle Error: corrupted trade asset ref."
265
+ )
266
+ }
267
+ }
268
+ var reactModel: TradeAsset {
269
+ switch self {
270
+ case .FiatAsset(let fiatAsset):
271
+ return .init(
272
+ fiatAsset: .init(
273
+ assetKind: fiatAsset.assetKind.rawValue,
274
+ serviceTradeID: fiatAsset.serviceTradeID,
275
+ serviceAccountID: fiatAsset.serviceAccountID,
276
+ currencyCode: fiatAsset.currencyCode,
277
+ amount: fiatAsset.amount,
278
+ linkedAccountID: fiatAsset.linkedAccountID,
279
+ service: fiatAsset.service.reactModel
280
+ ),
281
+ marketTradeAsset: nil,
282
+ transportAsset: nil,
283
+ otherAsset: nil,
284
+ nothingAsset: nil
285
+ )
286
+ case .MarketTradeAsset(let marketAsset):
287
+ return .init(
288
+ fiatAsset: nil,
289
+ marketTradeAsset: .init(
290
+ assetKind: marketAsset.assetKind.reactModel,
291
+ serviceAccountID: marketAsset.serviceAccountID,
292
+ serviceAssetID: marketAsset.serviceAssetID,
293
+ symbol: marketAsset.symbol,
294
+ amount: marketAsset.amount,
295
+ serviceTradeID: marketAsset.serviceTradeID,
296
+ linkedAccountID: marketAsset.linkedAccountID,
297
+ name: marketAsset.name,
298
+ color: marketAsset.color,
299
+ logoURL: marketAsset.logoURL,
300
+ service: marketAsset.service.reactModel
301
+ ),
302
+ transportAsset: nil,
303
+ otherAsset: nil,
304
+ nothingAsset: nil
305
+ )
306
+ case .TransportAsset(let transportAsset):
307
+ return .init(
308
+ fiatAsset: nil,
309
+ marketTradeAsset: nil,
310
+ transportAsset: .init(
311
+ assetKind: transportAsset.assetKind.rawValue,
312
+ serviceTradeID: transportAsset.serviceTradeID,
313
+ serviceAssetID: transportAsset.serviceAssetID,
314
+ serviceAccountID: transportAsset.serviceAccountID,
315
+ name: transportAsset.name,
316
+ description: transportAsset.description,
317
+ imageURL: transportAsset.imageURL,
318
+ originCoordinates: transportAsset.originCoordinates.reactModel,
319
+ originAddress: transportAsset.originAddress.reactModel,
320
+ destinationCoordinates: transportAsset.destinationCoordinates.reactModel,
321
+ destinationAddress: transportAsset.destinationAddress.reactModel,
322
+ seats: transportAsset.seats,
323
+ departureDateTime: transportAsset.departureDateTime,
324
+ arrivalDateTime: transportAsset.arrivalDateTime,
325
+ linkedAccountID: transportAsset.linkedAccountID,
326
+ service: transportAsset.service.reactModel
327
+ ),
328
+ otherAsset: nil,
329
+ nothingAsset: nil
330
+ )
331
+ case .OtherAsset(let otherAsset):
332
+ return .init(
333
+ fiatAsset: nil,
334
+ marketTradeAsset: nil,
335
+ transportAsset: nil,
336
+ otherAsset: .init(assetKind: otherAsset.assetKind.rawValue),
337
+ nothingAsset: nil
338
+ )
339
+ case .NothingAsset(let nothingAsset):
340
+ return .init(
341
+ fiatAsset: nil,
342
+ marketTradeAsset: nil,
343
+ transportAsset: nil,
344
+ otherAsset: nil,
345
+ nothingAsset: .init(assetKind: nothingAsset.assetKind.rawValue)
346
+ )
347
+ }
348
+ }
349
+ }
350
+
351
+ // MARK: Encoding only
352
+
353
+ extension Candle.Models.LinkedAccount {
354
+ var reactModel: LinkedAccount {
355
+ LinkedAccount(
356
+ linkedAccountID: linkedAccountID,
357
+ service: service.reactModel,
358
+ serviceUserID: serviceUserID,
359
+ details: details.reactModel
360
+ )
361
+ }
362
+ }
363
+
364
+ extension Candle.Models.LinkedAccountDetails {
365
+ var reactModel: LinkedAccountDetails {
366
+ switch self {
367
+ case .ActiveLinkedAccountDetails(let activeDetails):
368
+ return .init(
369
+ activeLinkedAccountDetails: .init(
370
+ state: activeDetails.state.rawValue,
371
+ accountOpened: activeDetails.accountOpened,
372
+ username: activeDetails.username,
373
+ emailAddress: activeDetails.emailAddress,
374
+ legalName: activeDetails.legalName
375
+ ),
376
+ inactiveLinkedAccountDetails: nil,
377
+ unavailableLinkedAccountDetails: nil,
378
+ )
379
+ case .InactiveLinkedAccountDetails(let inactiveDetails):
380
+ switch inactiveDetails.state {
381
+ case .inactive:
382
+ return .init(
383
+ activeLinkedAccountDetails: nil,
384
+ inactiveLinkedAccountDetails: .init(state: inactiveDetails.state.rawValue),
385
+ unavailableLinkedAccountDetails: nil,
386
+ )
387
+ case .unavailable:
388
+ return .init(
389
+ activeLinkedAccountDetails: nil,
390
+ inactiveLinkedAccountDetails: nil,
391
+ unavailableLinkedAccountDetails: .init(state: inactiveDetails.state.rawValue)
392
+ )
393
+ }
394
+ }
395
+ }
396
+ }
397
+
398
+ extension Models.MerchantLocation {
399
+ var reactModel: MerchantLocation {
400
+ .init(
401
+ countryCode: countryCode,
402
+ countrySubdivisionCode: countrySubdivisionCode,
403
+ localityName: localityName
404
+ )
405
+ }
406
+ }
407
+
408
+ extension Models.Counterparty {
409
+ var reactModel: Counterparty {
410
+ switch self {
411
+ case .MerchantCounterparty(let merchantCounterparty):
412
+ return .init(
413
+ merchantCounterparty: .init(
414
+ kind: merchantCounterparty.kind.rawValue,
415
+ name: merchantCounterparty.name,
416
+ logoURL: merchantCounterparty.logoURL,
417
+ location: merchantCounterparty.location.map(\.reactModel)
418
+ ),
419
+ userCounterparty: nil,
420
+ serviceCounterparty: nil
421
+ )
422
+ case .UserCounterparty(let userCounterparty):
423
+ return .init(
424
+ merchantCounterparty: nil,
425
+ userCounterparty: .init(
426
+ kind: userCounterparty.kind.rawValue,
427
+ legalName: userCounterparty.legalName,
428
+ avatarURL: userCounterparty.avatarURL,
429
+ username: userCounterparty.username
430
+ ),
431
+ serviceCounterparty: nil
432
+ )
433
+ case .ServiceCounterparty(let serviceCounterparty):
434
+ return .init(
435
+ merchantCounterparty: nil,
436
+ userCounterparty: nil,
437
+ serviceCounterparty: .init(
438
+ kind: serviceCounterparty.kind.rawValue,
439
+ service: serviceCounterparty.service.reactModel
440
+ )
441
+ )
442
+ }
443
+ }
444
+ }
445
+
446
+ extension Models.MarketAssetQuoteRequest.AssetKindPayload {
447
+ init(reactModel: MarketAssetKind) {
448
+ switch reactModel {
449
+ case .crypto: self = .crypto
450
+ case .stock: self = .stock
451
+ }
452
+ }
453
+ }
454
+
455
+ extension Models.MarketAssetRef.AssetKindPayload {
456
+ init(reactModel: MarketAssetKind) {
457
+ switch reactModel {
458
+ case .crypto: self = .crypto
459
+ case .stock: self = .stock
460
+ }
461
+ }
462
+ }
463
+
464
+ extension Models.MarketAccount.AssetKindPayload {
465
+ var reactModel: MarketAssetKind {
466
+ switch self {
467
+ case .crypto: return .crypto
468
+ case .stock: return .stock
469
+ }
470
+ }
471
+ }
472
+
473
+ extension Models.Trade {
474
+ var reactModel: Trade {
475
+ .init(
476
+ dateTime: dateTime,
477
+ state: state.reactModel,
478
+ counterparty: counterparty.reactModel,
479
+ lost: lost.reactModel,
480
+ gained: gained.reactModel
481
+ )
482
+ }
483
+ }
484
+
485
+ extension Models.TradeQuote {
486
+ var reactModel: TradeQuote {
487
+ .init(
488
+ lost: lost.reactModel,
489
+ gained: gained.reactModel,
490
+ context: context,
491
+ expirationDateTime: expirationDateTime
492
+ )
493
+ }
494
+ }
495
+
496
+ extension Models.FiatMarketAccountKind {
497
+ var reactModel: FiatMarketAccountKind {
498
+ switch self {
499
+ case .individual: return .individual
500
+ case .joint: return .joint
501
+ case .rothIra: return .rothira
502
+ case .traditionalIra: return .traditionalira
503
+ case .business: return .business
504
+ }
505
+ }
506
+ }
507
+
508
+ extension Models.TransportAccountKind {
509
+ var reactModel: TransportAccountKind {
510
+ switch self {
511
+ case .individual: return .individual
512
+ case .joint: return .joint
513
+ case .business: return .business
514
+ }
515
+ }
516
+ }
517
+
518
+ extension Models.ACHAccountKind {
519
+ var reactModel: ACHAccountKind {
520
+ switch self {
521
+ case .checking: return .checking
522
+ case .savings: return .savings
523
+ }
524
+ }
525
+ }
526
+
527
+ extension Models.Trade.StatePayload {
528
+ var reactModel: TradeState {
529
+ switch self {
530
+ case .success: return .success
531
+ case .failure: return .failure
532
+ case .inProgress: return .inprogress
533
+ }
534
+ }
535
+ }
536
+
537
+ extension Models.LinkedAccountStatusRef.StatePayload {
538
+ var reactModel: LinkedAccountState {
539
+ switch self {
540
+ case .active: return .active
541
+ case .inactive: return .inactive
542
+ case .unavailable: return .unavailable
543
+ }
544
+ }
545
+ }
546
+
547
+ extension Models.LinkedAccountStatusRef {
548
+ var reactModel: LinkedAccountStatusRef {
549
+ .init(
550
+ linkedAccountID: linkedAccountID,
551
+ service: service.reactModel,
552
+ serviceUserID: serviceUserID,
553
+ state: state.reactModel
554
+ )
555
+ }
556
+ }
557
+
558
+ extension Models.ACHDetails {
559
+ var reactModel: ACHDetails {
560
+ .init(
561
+ accountNumber: accountNumber,
562
+ routingNumber: routingNumber,
563
+ accountKind: accountKind.reactModel
564
+ )
565
+ }
566
+ }
567
+
568
+ extension Models.WireDetails {
569
+ var reactModel: WireDetails {
570
+ .init(accountNumber: accountNumber, routingNumber: routingNumber)
571
+ }
572
+ }
573
+
574
+ extension Models.AssetAccount {
575
+ var reactModel: AssetAccount {
576
+ switch self {
577
+ case .FiatAccount(let fiatDetails):
578
+ return AssetAccount(
579
+ fiatAccount: .init(
580
+ assetKind: fiatDetails.assetKind.rawValue,
581
+ serviceAccountID: fiatDetails.serviceAccountID,
582
+ accountKind: fiatDetails.accountKind.reactModel,
583
+ nickname: fiatDetails.nickname,
584
+ currencyCode: fiatDetails.currencyCode,
585
+ balance: fiatDetails.balance,
586
+ ach: fiatDetails.ach.map(\.reactModel),
587
+ wire: fiatDetails.wire.map(\.reactModel),
588
+ linkedAccountID: fiatDetails.linkedAccountID,
589
+ service: fiatDetails.service.reactModel
590
+ ),
591
+ marketAccount: nil,
592
+ transportAccount: nil
593
+ )
594
+ case .MarketAccount(let marketDetails):
595
+ return AssetAccount(
596
+ fiatAccount: nil,
597
+ marketAccount: .init(
598
+ assetKind: marketDetails.assetKind.reactModel,
599
+ serviceAccountID: marketDetails.serviceAccountID,
600
+ accountKind: marketDetails.accountKind.reactModel,
601
+ nickname: marketDetails.nickname,
602
+ linkedAccountID: marketDetails.linkedAccountID,
603
+ service: marketDetails.service.reactModel
604
+ ),
605
+ transportAccount: nil
606
+ )
607
+ case .TransportAccount(let transportDetails):
608
+ return AssetAccount(
609
+ fiatAccount: nil,
610
+ marketAccount: nil,
611
+ transportAccount: .init(
612
+ assetKind: transportDetails.assetKind.rawValue,
613
+ serviceAccountID: transportDetails.serviceAccountID,
614
+ accountKind: transportDetails.accountKind.reactModel,
615
+ nickname: transportDetails.nickname,
616
+ linkedAccountID: transportDetails.linkedAccountID,
617
+ service: transportDetails.service.reactModel
618
+ )
619
+ )
620
+ }
621
+ }
622
+ }
623
+
624
+ // MARK: Decoding only
625
+
626
+ extension Models.GetLinkedAccount.Input.Path {
627
+ init(reactModel: LinkedAccountRef) { self.init(linkedAccountID: reactModel.linkedAccountID, ) }
628
+ }
629
+
630
+ extension Models.UnlinkAccount.Input.Path {
631
+ init(reactModel: LinkedAccountRef) { self.init(linkedAccountID: reactModel.linkedAccountID, ) }
632
+ }
633
+
634
+ extension Models.GetAssetAccount.Input.Path {
635
+ init(reactModel: AssetAccountRef) {
636
+ self.init(
637
+ linkedAccountID: reactModel.linkedAccountID,
638
+ assetKind: .init(reactModel: reactModel.assetKind),
639
+ serviceAccountID: reactModel.serviceAccountID
640
+ )
641
+ }
642
+ }
643
+
644
+ extension Models.TradeRef {
645
+ init(reactModel: TradeRef) throws {
646
+ self.init(
647
+ lost: try .init(reactModel: reactModel.lost),
648
+ gained: try .init(reactModel: reactModel.gained)
649
+ )
650
+ }
651
+ }
652
+
653
+ extension Models.GetAssetAccounts.Input.Query {
654
+ init(reactModel: AssetAccountsQuery) {
655
+ self.init(
656
+ linkedAccountIDs: reactModel.linkedAccountIDs,
657
+ assetKind: reactModel.assetKind.map(AssetKindPayload.init(reactModel:))
658
+ )
659
+ }
660
+ }
661
+
662
+ extension Models.GetTrades.Input.Query {
663
+ init(reactModel: TradesQuery) {
664
+ self.init(
665
+ linkedAccountIDs: reactModel.linkedAccountIDs,
666
+ dateTimeSpan: reactModel.dateTimeSpan,
667
+ gainedAssetKind: reactModel.gainedAssetKind.map(
668
+ GainedAssetKindPayload.init(reactModel:)
669
+ ),
670
+ lostAssetKind: reactModel.lostAssetKind.map(LostAssetKindPayload.init(reactModel:)),
671
+ counterpartyKind: reactModel.counterpartyKind.map(
672
+ CounterpartyKindPayload.init(reactModel:)
673
+ )
674
+ )
675
+ }
676
+ }
677
+
678
+ extension Models.TradeQuotesRequest {
679
+ init(reactModel: TradeQuotesRequest) throws {
680
+ self.init(
681
+ linkedAccountIDs: reactModel.linkedAccountIDs,
682
+ gained: try .init(reactModel: reactModel.gained),
683
+ lost: try .init(reactModel: reactModel.lost)
684
+ )
685
+ }
686
+ }
687
+
688
+ extension Models.TradeAssetQuoteRequest {
689
+ init(reactModel: TradeAssetQuoteRequest) throws {
690
+ if let fiatAssetQuoteRequest = reactModel.fiatAssetQuoteRequest {
691
+ self = .FiatAssetQuoteRequest(
692
+ .init(
693
+ assetKind: .fiat,
694
+ serviceAccountID: fiatAssetQuoteRequest.serviceAccountID,
695
+ currencyCode: fiatAssetQuoteRequest.currencyCode,
696
+ amount: fiatAssetQuoteRequest.amount
697
+ )
698
+ )
699
+ } else if let marketAssetQuoteRequest = reactModel.marketAssetQuoteRequest {
700
+ self = .MarketAssetQuoteRequest(
701
+ .init(
702
+ assetKind: .init(reactModel: marketAssetQuoteRequest.assetKind),
703
+ serviceAccountID: marketAssetQuoteRequest.serviceAccountID,
704
+ serviceAssetID: marketAssetQuoteRequest.serviceAssetID,
705
+ symbol: marketAssetQuoteRequest.symbol,
706
+ amount: marketAssetQuoteRequest.amount
707
+ )
708
+ )
709
+ } else if let transportAssetQuoteRequest = reactModel.transportAssetQuoteRequest {
710
+ self = .TransportAssetQuoteRequest(
711
+ .init(
712
+ assetKind: .transport,
713
+ serviceAssetID: transportAssetQuoteRequest.serviceAssetID,
714
+ originCoordinates: transportAssetQuoteRequest.originCoordinates.map(
715
+ Models.Coordinates.init(reactModel:)
716
+ ),
717
+ originAddress: transportAssetQuoteRequest.originAddress.map(
718
+ Models.Address.init(reactModel:)
719
+ ),
720
+ destinationCoordinates: transportAssetQuoteRequest.destinationCoordinates.map(
721
+ Models.Coordinates.init(reactModel:)
722
+ ),
723
+ destinationAddress: transportAssetQuoteRequest.destinationAddress.map(
724
+ Models.Address.init(reactModel:)
725
+ ),
726
+ seats: transportAssetQuoteRequest.seats,
727
+ serviceAccountID: transportAssetQuoteRequest.serviceAccountID
728
+ )
729
+ )
730
+ } else if reactModel.nothingAssetQuoteRequest != nil {
731
+ self = .NothingAssetQuoteRequest(.init(assetKind: .nothing))
732
+ } else {
733
+ throw CandleError.unexpected(
734
+ message: "Internal Candle Error: corrupted trade asset quote request."
735
+ )
736
+ }
737
+ }
738
+ }
739
+
740
+ extension Models.GetAssetAccount.Input.Path.AssetKindPayload {
741
+ init(reactModel: AssetAccountKind) {
742
+ switch reactModel {
743
+ case .fiat: self = .fiat
744
+ case .stock: self = .stock
745
+ case .crypto: self = .crypto
746
+ case .transport: self = .transport
747
+ }
748
+ }
749
+ }
750
+
751
+ extension Models.GetAssetAccounts.Input.Query.AssetKindPayload {
752
+ init(reactModel: AssetAccountKind) {
753
+ switch reactModel {
754
+ case .fiat: self = .fiat
755
+ case .stock: self = .stock
756
+ case .crypto: self = .crypto
757
+ case .transport: self = .transport
758
+ }
759
+ }
760
+ }
761
+
762
+ extension Models.GetTrades.Input.Query.GainedAssetKindPayload {
763
+ init(reactModel: TradeAssetKind) {
764
+ switch reactModel {
765
+ case .fiat: self = .fiat
766
+ case .stock: self = .stock
767
+ case .crypto: self = .crypto
768
+ case .transport: self = .transport
769
+ case .other: self = .other
770
+ case .nothing: self = .nothing
771
+ }
772
+ }
773
+ }
774
+
775
+ extension Models.GetTrades.Input.Query.LostAssetKindPayload {
776
+ init(reactModel: TradeAssetKind) {
777
+ switch reactModel {
778
+ case .fiat: self = .fiat
779
+ case .stock: self = .stock
780
+ case .crypto: self = .crypto
781
+ case .transport: self = .transport
782
+ case .other: self = .other
783
+ case .nothing: self = .nothing
784
+ }
785
+ }
786
+ }
787
+
788
+ extension Models.GetTrades.Input.Query.CounterpartyKindPayload {
789
+ init(reactModel: CounterpartyKind) {
790
+ switch reactModel {
791
+ case .merchant: self = .merchant
792
+ case .service: self = .service
793
+ case .user: self = .user
794
+ }
795
+ }
796
+ }
797
+
798
+ extension Models.TradeAssetRef {
799
+ init(reactModel: TradeAssetRef) throws {
800
+ if let fiatAssetRef = reactModel.fiatAssetRef {
801
+ self = .FiatAssetRef(
802
+ .init(
803
+ assetKind: .fiat,
804
+ serviceTradeID: fiatAssetRef.serviceTradeID,
805
+ linkedAccountID: fiatAssetRef.linkedAccountID
806
+ )
807
+ )
808
+ } else if let marketTradeAssetRef = reactModel.marketTradeAssetRef {
809
+ self = .MarketAssetRef(
810
+ .init(
811
+ assetKind: Models.MarketAssetRef.AssetKindPayload.init(
812
+ reactModel: marketTradeAssetRef.assetKind
813
+ ),
814
+ serviceTradeID: marketTradeAssetRef.serviceTradeID,
815
+ linkedAccountID: marketTradeAssetRef.linkedAccountID
816
+ )
817
+ )
818
+ } else if let transportAssetRef = reactModel.transportAssetRef {
819
+ self = .TransportAssetRef(
820
+ .init(
821
+ assetKind: .transport,
822
+ serviceTradeID: transportAssetRef.serviceTradeID,
823
+ linkedAccountID: transportAssetRef.linkedAccountID
824
+ )
825
+ )
826
+ } else if reactModel.otherAssetRef != nil {
827
+ self = .OtherAsset(.init(assetKind: .other))
828
+ } else if reactModel.nothingAssetRef != nil {
829
+ self = .NothingAsset(.init(assetKind: .nothing))
830
+ } else {
831
+ throw CandleError.unexpected(
832
+ message: "Internal Candle Error: corrupted trade asset ref."
833
+ )
834
+ }
835
+ }
836
+ }
837
+
838
+ extension Models.TradeQuote {
839
+ init(reactModel: TradeQuote) throws {
840
+ self.init(
841
+ lost: try .init(reactModel: reactModel.lost),
842
+ gained: try .init(reactModel: reactModel.gained),
843
+ context: reactModel.context,
844
+ expirationDateTime: reactModel.expirationDateTime
845
+ )
846
+ }
847
+ }