@json-eval-rs/react-native 0.0.28

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.
@@ -0,0 +1,852 @@
1
+ #import "JsonEvalRs.h"
2
+ #import <React/RCTLog.h>
3
+ #include "json-eval-bridge.h"
4
+
5
+ using namespace jsoneval;
6
+
7
+ @implementation JsonEvalRs
8
+
9
+ RCT_EXPORT_MODULE()
10
+
11
+ // Helper methods
12
+ // Note: These conversions are required by React Native bridge architecture
13
+ // We minimize copies where possible, but some are unavoidable due to lifetime management
14
+ - (NSString *)stringFromStdString:(const std::string &)str {
15
+ // Creates NSString from UTF-8 C string (copies data)
16
+ return [NSString stringWithUTF8String:str.c_str()];
17
+ }
18
+
19
+ - (std::string)stdStringFromNSString:(NSString *)str {
20
+ if (str == nil) return "";
21
+ // UTF8String returns a pointer to UTF-8 representation (minimal copy)
22
+ // We must copy to std::string for safe lifetime management
23
+ const char* utf8 = [str UTF8String];
24
+ return utf8 ? std::string(utf8) : std::string();
25
+ }
26
+
27
+ - (NSString *)arrayToJsonString:(NSArray *)array {
28
+ NSMutableArray *quotedItems = [NSMutableArray array];
29
+ for (NSString *item in array) {
30
+ [quotedItems addObject:[NSString stringWithFormat:@"\"%@\"", item]];
31
+ }
32
+ return [NSString stringWithFormat:@"[%@]", [quotedItems componentsJoinedByString:@","]];
33
+ }
34
+
35
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(create:(NSString *)schema
36
+ context:(NSString *)context
37
+ data:(NSString *)data)
38
+ {
39
+ std::string schemaStr = [self stdStringFromNSString:schema];
40
+ std::string contextStr = [self stdStringFromNSString:context];
41
+ std::string dataStr = [self stdStringFromNSString:data];
42
+
43
+ std::string handle = JsonEvalBridge::create(schemaStr, contextStr, dataStr);
44
+ return [self stringFromStdString:handle];
45
+ }
46
+
47
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(createFromMsgpack:(NSArray *)schemaMsgpack
48
+ context:(NSString *)context
49
+ data:(NSString *)data)
50
+ {
51
+ std::string contextStr = [self stdStringFromNSString:context];
52
+ std::string dataStr = [self stdStringFromNSString:data];
53
+
54
+ // Convert NSArray to std::vector<uint8_t>
55
+ std::vector<uint8_t> msgpackBytes;
56
+ msgpackBytes.reserve([schemaMsgpack count]);
57
+ for (NSNumber *num in schemaMsgpack) {
58
+ msgpackBytes.push_back([num unsignedCharValue]);
59
+ }
60
+
61
+ std::string handle = JsonEvalBridge::createFromMsgpack(msgpackBytes, contextStr, dataStr);
62
+ return [self stringFromStdString:handle];
63
+ }
64
+
65
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(createFromCache:(NSString *)cacheKey
66
+ context:(NSString *)context
67
+ data:(NSString *)data)
68
+ {
69
+ std::string cacheKeyStr = [self stdStringFromNSString:cacheKey];
70
+ std::string contextStr = [self stdStringFromNSString:context];
71
+ std::string dataStr = [self stdStringFromNSString:data];
72
+
73
+ std::string handle = JsonEvalBridge::createFromCache(cacheKeyStr, contextStr, dataStr);
74
+ return [self stringFromStdString:handle];
75
+ }
76
+
77
+ RCT_EXPORT_METHOD(evaluate:(NSString *)handle
78
+ data:(NSString *)data
79
+ context:(NSString *)context
80
+ resolver:(RCTPromiseResolveBlock)resolve
81
+ rejecter:(RCTPromiseRejectBlock)reject)
82
+ {
83
+ // Convert Objective-C strings to C++ (required by bridge architecture)
84
+ std::string handleStr = [self stdStringFromNSString:handle];
85
+ std::string dataStr = [self stdStringFromNSString:data];
86
+ std::string contextStr = [self stdStringFromNSString:context];
87
+
88
+ JsonEvalBridge::evaluateAsync(handleStr, dataStr, contextStr,
89
+ [resolve, reject](const std::string& result, const std::string& error) {
90
+ if (error.empty()) {
91
+ // Zero-copy within native: direct pointer access to result
92
+ resolve([NSString stringWithUTF8String:result.c_str()]);
93
+ } else {
94
+ reject(@"EVALUATE_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
95
+ }
96
+ }
97
+ );
98
+ }
99
+
100
+ RCT_EXPORT_METHOD(compileLogic:(NSString *)handle
101
+ logicStr:(NSString *)logicStr
102
+ resolver:(RCTPromiseResolveBlock)resolve
103
+ rejecter:(RCTPromiseRejectBlock)reject)
104
+ {
105
+ try {
106
+ std::string handleStr = [self stdStringFromNSString:handle];
107
+ std::string logicStrCpp = [self stdStringFromNSString:logicStr];
108
+ uint64_t logicId = JsonEvalBridge::compileLogic(handleStr, logicStrCpp);
109
+ if (logicId == 0) {
110
+ reject(@"COMPILE_LOGIC_ERROR", @"Failed to compile logic", nil);
111
+ } else {
112
+ resolve(@(logicId));
113
+ }
114
+ } catch (const std::exception& e) {
115
+ reject(@"COMPILE_LOGIC_ERROR", [NSString stringWithUTF8String:e.what()], nil);
116
+ }
117
+ }
118
+
119
+ RCT_EXPORT_METHOD(runLogic:(NSString *)handle
120
+ logicId:(nonnull NSNumber *)logicId
121
+ data:(NSString *)data
122
+ context:(NSString *)context
123
+ resolver:(RCTPromiseResolveBlock)resolve
124
+ rejecter:(RCTPromiseRejectBlock)reject)
125
+ {
126
+ std::string handleStr = [self stdStringFromNSString:handle];
127
+ uint64_t logicIdValue = [logicId unsignedLongLongValue];
128
+ std::string dataStr = [self stdStringFromNSString:data];
129
+ std::string contextStr = [self stdStringFromNSString:context];
130
+
131
+ JsonEvalBridge::runLogicAsync(handleStr, logicIdValue, dataStr, contextStr,
132
+ [resolve, reject](const std::string& result, const std::string& error) {
133
+ if (error.empty()) {
134
+ resolve([NSString stringWithUTF8String:result.c_str()]);
135
+ } else {
136
+ reject(@"RUN_LOGIC_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
137
+ }
138
+ }
139
+ );
140
+ }
141
+
142
+ RCT_EXPORT_METHOD(validate:(NSString *)handle
143
+ data:(NSString *)data
144
+ context:(NSString *)context
145
+ resolver:(RCTPromiseResolveBlock)resolve
146
+ rejecter:(RCTPromiseRejectBlock)reject)
147
+ {
148
+ std::string handleStr = [self stdStringFromNSString:handle];
149
+ std::string dataStr = [self stdStringFromNSString:data];
150
+ std::string contextStr = [self stdStringFromNSString:context];
151
+
152
+ JsonEvalBridge::validateAsync(handleStr, dataStr, contextStr,
153
+ [resolve, reject](const std::string& result, const std::string& error) {
154
+ if (error.empty()) {
155
+ resolve([NSString stringWithUTF8String:result.c_str()]);
156
+ } else {
157
+ reject(@"VALIDATE_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
158
+ }
159
+ }
160
+ );
161
+ }
162
+
163
+ RCT_EXPORT_METHOD(evaluateDependents:(NSString *)handle
164
+ changedPathsJson:(NSString *)changedPathsJson
165
+ data:(NSString *)data
166
+ context:(NSString *)context
167
+ reEvaluate:(BOOL)reEvaluate
168
+ resolver:(RCTPromiseResolveBlock)resolve
169
+ rejecter:(RCTPromiseRejectBlock)reject)
170
+ {
171
+ std::string handleStr = [self stdStringFromNSString:handle];
172
+ std::string pathsJsonStr = [self stdStringFromNSString:changedPathsJson];
173
+ std::string dataStr = [self stdStringFromNSString:data];
174
+ std::string contextStr = [self stdStringFromNSString:context];
175
+
176
+ JsonEvalBridge::evaluateDependentsAsync(handleStr, pathsJsonStr, dataStr, contextStr, reEvaluate,
177
+ [resolve, reject](const std::string& result, const std::string& error) {
178
+ if (error.empty()) {
179
+ resolve([NSString stringWithUTF8String:result.c_str()]);
180
+ } else {
181
+ reject(@"EVALUATE_DEPENDENTS_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
182
+ }
183
+ }
184
+ );
185
+ }
186
+
187
+ RCT_EXPORT_METHOD(getEvaluatedSchema:(NSString *)handle
188
+ skipLayout:(BOOL)skipLayout
189
+ resolver:(RCTPromiseResolveBlock)resolve
190
+ rejecter:(RCTPromiseRejectBlock)reject)
191
+ {
192
+ std::string handleStr = [self stdStringFromNSString:handle];
193
+
194
+ JsonEvalBridge::getEvaluatedSchemaAsync(handleStr, skipLayout,
195
+ [resolve, reject](const std::string& result, const std::string& error) {
196
+ if (error.empty()) {
197
+ resolve([NSString stringWithUTF8String:result.c_str()]);
198
+ } else {
199
+ reject(@"GET_SCHEMA_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
200
+ }
201
+ }
202
+ );
203
+ }
204
+
205
+ RCT_EXPORT_METHOD(getSchemaValue:(NSString *)handle
206
+ resolver:(RCTPromiseResolveBlock)resolve
207
+ rejecter:(RCTPromiseRejectBlock)reject)
208
+ {
209
+ std::string handleStr = [self stdStringFromNSString:handle];
210
+
211
+ JsonEvalBridge::getSchemaValueAsync(handleStr,
212
+ [resolve, reject](const std::string& result, const std::string& error) {
213
+ if (error.empty()) {
214
+ resolve([NSString stringWithUTF8String:result.c_str()]);
215
+ } else {
216
+ reject(@"GET_VALUE_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
217
+ }
218
+ }
219
+ );
220
+ }
221
+
222
+ RCT_EXPORT_METHOD(getEvaluatedSchemaWithoutParams:(NSString *)handle
223
+ skipLayout:(BOOL)skipLayout
224
+ resolver:(RCTPromiseResolveBlock)resolve
225
+ rejecter:(RCTPromiseRejectBlock)reject)
226
+ {
227
+ std::string handleStr = [self stdStringFromNSString:handle];
228
+
229
+ JsonEvalBridge::getEvaluatedSchemaWithoutParamsAsync(handleStr, skipLayout,
230
+ [resolve, reject](const std::string& result, const std::string& error) {
231
+ if (error.empty()) {
232
+ resolve([NSString stringWithUTF8String:result.c_str()]);
233
+ } else {
234
+ reject(@"GET_SCHEMA_WITHOUT_PARAMS_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
235
+ }
236
+ }
237
+ );
238
+ }
239
+
240
+ RCT_EXPORT_METHOD(getEvaluatedSchemaByPath:(NSString *)handle
241
+ path:(NSString *)path
242
+ skipLayout:(BOOL)skipLayout
243
+ resolver:(RCTPromiseResolveBlock)resolve
244
+ rejecter:(RCTPromiseRejectBlock)reject)
245
+ {
246
+ std::string handleStr = [self stdStringFromNSString:handle];
247
+ std::string pathStr = [self stdStringFromNSString:path];
248
+
249
+ JsonEvalBridge::getEvaluatedSchemaByPathAsync(handleStr, pathStr, skipLayout,
250
+ [resolve, reject](const std::string& result, const std::string& error) {
251
+ if (error.empty()) {
252
+ resolve([NSString stringWithUTF8String:result.c_str()]);
253
+ } else {
254
+ reject(@"GET_EVALUATED_SCHEMA_BY_PATH_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
255
+ }
256
+ }
257
+ );
258
+ }
259
+
260
+ RCT_EXPORT_METHOD(getEvaluatedSchemaByPaths:(NSString *)handle
261
+ pathsJson:(NSString *)pathsJson
262
+ skipLayout:(BOOL)skipLayout
263
+ resolver:(RCTPromiseResolveBlock)resolve
264
+ rejecter:(RCTPromiseRejectBlock)reject)
265
+ {
266
+ std::string handleStr = [self stdStringFromNSString:handle];
267
+ std::string pathsJsonStr = [self stdStringFromNSString:pathsJson];
268
+
269
+ JsonEvalBridge::getEvaluatedSchemaByPathsAsync(handleStr, pathsJsonStr, skipLayout,
270
+ [resolve, reject](const std::string& result, const std::string& error) {
271
+ if (error.empty()) {
272
+ resolve([NSString stringWithUTF8String:result.c_str()]);
273
+ } else {
274
+ reject(@"GET_EVALUATED_SCHEMA_BY_PATHS_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
275
+ }
276
+ }
277
+ );
278
+ }
279
+
280
+ RCT_EXPORT_METHOD(getSchemaByPath:(NSString *)handle
281
+ path:(NSString *)path
282
+ resolver:(RCTPromiseResolveBlock)resolve
283
+ rejecter:(RCTPromiseRejectBlock)reject)
284
+ {
285
+ std::string handleStr = [self stdStringFromNSString:handle];
286
+ std::string pathStr = [self stdStringFromNSString:path];
287
+
288
+ JsonEvalBridge::getSchemaByPathAsync(handleStr, pathStr,
289
+ [resolve, reject](const std::string& result, const std::string& error) {
290
+ if (error.empty()) {
291
+ resolve([NSString stringWithUTF8String:result.c_str()]);
292
+ } else {
293
+ reject(@"GET_SCHEMA_BY_PATH_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
294
+ }
295
+ }
296
+ );
297
+ }
298
+
299
+ RCT_EXPORT_METHOD(getSchemaByPaths:(NSString *)handle
300
+ pathsJson:(NSString *)pathsJson
301
+ resolver:(RCTPromiseResolveBlock)resolve
302
+ rejecter:(RCTPromiseRejectBlock)reject)
303
+ {
304
+ std::string handleStr = [self stdStringFromNSString:handle];
305
+ std::string pathsJsonStr = [self stdStringFromNSString:pathsJson];
306
+
307
+ JsonEvalBridge::getSchemaByPathsAsync(handleStr, pathsJsonStr,
308
+ [resolve, reject](const std::string& result, const std::string& error) {
309
+ if (error.empty()) {
310
+ resolve([NSString stringWithUTF8String:result.c_str()]);
311
+ } else {
312
+ reject(@"GET_SCHEMA_BY_PATH_S_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
313
+ }
314
+ }
315
+ );
316
+ }
317
+
318
+ RCT_EXPORT_METHOD(reloadSchema:(NSString *)handle
319
+ schema:(NSString *)schema
320
+ context:(NSString *)context
321
+ data:(NSString *)data
322
+ resolver:(RCTPromiseResolveBlock)resolve
323
+ rejecter:(RCTPromiseRejectBlock)reject)
324
+ {
325
+ std::string handleStr = [self stdStringFromNSString:handle];
326
+ std::string schemaStr = [self stdStringFromNSString:schema];
327
+ std::string contextStr = [self stdStringFromNSString:context];
328
+ std::string dataStr = [self stdStringFromNSString:data];
329
+
330
+ JsonEvalBridge::reloadSchemaAsync(handleStr, schemaStr, contextStr, dataStr,
331
+ [resolve, reject](const std::string& result, const std::string& error) {
332
+ if (error.empty()) {
333
+ resolve([NSString stringWithUTF8String:result.c_str()]);
334
+ } else {
335
+ reject(@"RELOAD_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
336
+ }
337
+ }
338
+ );
339
+ }
340
+
341
+ RCT_EXPORT_METHOD(reloadSchemaMsgpack:(NSString *)handle
342
+ schemaMsgpack:(NSArray *)schemaMsgpack
343
+ context:(NSString *)context
344
+ data:(NSString *)data
345
+ resolver:(RCTPromiseResolveBlock)resolve
346
+ rejecter:(RCTPromiseRejectBlock)reject)
347
+ {
348
+ std::string handleStr = [self stdStringFromNSString:handle];
349
+ std::string contextStr = [self stdStringFromNSString:context];
350
+ std::string dataStr = [self stdStringFromNSString:data];
351
+
352
+ // Convert NSArray to std::vector<uint8_t>
353
+ std::vector<uint8_t> msgpackBytes;
354
+ msgpackBytes.reserve([schemaMsgpack count]);
355
+ for (NSNumber *num in schemaMsgpack) {
356
+ msgpackBytes.push_back([num unsignedCharValue]);
357
+ }
358
+
359
+ JsonEvalBridge::reloadSchemaMsgpackAsync(handleStr, msgpackBytes, contextStr, dataStr,
360
+ [resolve, reject](const std::string& result, const std::string& error) {
361
+ if (error.empty()) {
362
+ resolve([NSString stringWithUTF8String:result.c_str()]);
363
+ } else {
364
+ reject(@"RELOAD_MSGPACK_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
365
+ }
366
+ }
367
+ );
368
+ }
369
+
370
+ RCT_EXPORT_METHOD(reloadSchemaFromCache:(NSString *)handle
371
+ cacheKey:(NSString *)cacheKey
372
+ context:(NSString *)context
373
+ data:(NSString *)data
374
+ resolver:(RCTPromiseResolveBlock)resolve
375
+ rejecter:(RCTPromiseRejectBlock)reject)
376
+ {
377
+ std::string handleStr = [self stdStringFromNSString:handle];
378
+ std::string cacheKeyStr = [self stdStringFromNSString:cacheKey];
379
+ std::string contextStr = [self stdStringFromNSString:context];
380
+ std::string dataStr = [self stdStringFromNSString:data];
381
+
382
+ JsonEvalBridge::reloadSchemaFromCacheAsync(handleStr, cacheKeyStr, contextStr, dataStr,
383
+ [resolve, reject](const std::string& result, const std::string& error) {
384
+ if (error.empty()) {
385
+ resolve([NSString stringWithUTF8String:result.c_str()]);
386
+ } else {
387
+ reject(@"RELOAD_CACHE_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
388
+ }
389
+ }
390
+ );
391
+ }
392
+
393
+ RCT_EXPORT_METHOD(cacheStats:(NSString *)handle
394
+ resolver:(RCTPromiseResolveBlock)resolve
395
+ rejecter:(RCTPromiseRejectBlock)reject)
396
+ {
397
+ std::string handleStr = [self stdStringFromNSString:handle];
398
+
399
+ JsonEvalBridge::cacheStatsAsync(handleStr,
400
+ [resolve, reject](const std::string& result, const std::string& error) {
401
+ if (error.empty()) {
402
+ resolve([NSString stringWithUTF8String:result.c_str()]);
403
+ } else {
404
+ reject(@"CACHE_STATS_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
405
+ }
406
+ }
407
+ );
408
+ }
409
+
410
+ RCT_EXPORT_METHOD(clearCache:(NSString *)handle
411
+ resolver:(RCTPromiseResolveBlock)resolve
412
+ rejecter:(RCTPromiseRejectBlock)reject)
413
+ {
414
+ std::string handleStr = [self stdStringFromNSString:handle];
415
+
416
+ JsonEvalBridge::clearCacheAsync(handleStr,
417
+ [resolve, reject](const std::string& result, const std::string& error) {
418
+ if (error.empty()) {
419
+ resolve([NSString stringWithUTF8String:result.c_str()]);
420
+ } else {
421
+ reject(@"CLEAR_CACHE_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
422
+ }
423
+ }
424
+ );
425
+ }
426
+
427
+ RCT_EXPORT_METHOD(cacheLen:(NSString *)handle
428
+ resolver:(RCTPromiseResolveBlock)resolve
429
+ rejecter:(RCTPromiseRejectBlock)reject)
430
+ {
431
+ std::string handleStr = [self stdStringFromNSString:handle];
432
+
433
+ JsonEvalBridge::cacheLenAsync(handleStr,
434
+ [resolve, reject](const std::string& result, const std::string& error) {
435
+ if (error.empty()) {
436
+ NSInteger len = [[NSString stringWithUTF8String:result.c_str()] integerValue];
437
+ resolve(@(len));
438
+ } else {
439
+ reject(@"CACHE_LEN_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
440
+ }
441
+ }
442
+ );
443
+ }
444
+
445
+ RCT_EXPORT_METHOD(enableCache:(NSString *)handle
446
+ resolver:(RCTPromiseResolveBlock)resolve
447
+ rejecter:(RCTPromiseRejectBlock)reject)
448
+ {
449
+ std::string handleStr = [self stdStringFromNSString:handle];
450
+
451
+ JsonEvalBridge::enableCacheAsync(handleStr,
452
+ [resolve, reject](const std::string& result, const std::string& error) {
453
+ if (error.empty()) {
454
+ resolve(nil);
455
+ } else {
456
+ reject(@"ENABLE_CACHE_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
457
+ }
458
+ }
459
+ );
460
+ }
461
+
462
+ RCT_EXPORT_METHOD(disableCache:(NSString *)handle
463
+ resolver:(RCTPromiseResolveBlock)resolve
464
+ rejecter:(RCTPromiseRejectBlock)reject)
465
+ {
466
+ std::string handleStr = [self stdStringFromNSString:handle];
467
+
468
+ JsonEvalBridge::disableCacheAsync(handleStr,
469
+ [resolve, reject](const std::string& result, const std::string& error) {
470
+ if (error.empty()) {
471
+ resolve(nil);
472
+ } else {
473
+ reject(@"DISABLE_CACHE_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
474
+ }
475
+ }
476
+ );
477
+ }
478
+
479
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(isCacheEnabled:(NSString *)handle)
480
+ {
481
+ std::string handleStr = [self stdStringFromNSString:handle];
482
+ bool enabled = JsonEvalBridge::isCacheEnabled(handleStr);
483
+ return @(enabled);
484
+ }
485
+
486
+ RCT_EXPORT_METHOD(validatePaths:(NSString *)handle
487
+ data:(NSString *)data
488
+ context:(NSString *)context
489
+ paths:(NSArray *)paths
490
+ resolver:(RCTPromiseResolveBlock)resolve
491
+ rejecter:(RCTPromiseRejectBlock)reject)
492
+ {
493
+ std::string handleStr = [self stdStringFromNSString:handle];
494
+ std::string dataStr = [self stdStringFromNSString:data];
495
+ std::string contextStr = [self stdStringFromNSString:context];
496
+ std::string pathsJson = paths ? [self stdStringFromNSString:[self arrayToJsonString:paths]] : "";
497
+
498
+ JsonEvalBridge::validatePathsAsync(handleStr, dataStr, contextStr, pathsJson,
499
+ [resolve, reject](const std::string& result, const std::string& error) {
500
+ if (error.empty()) {
501
+ resolve([NSString stringWithUTF8String:result.c_str()]);
502
+ } else {
503
+ reject(@"VALIDATE_PATHS_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
504
+ }
505
+ }
506
+ );
507
+ }
508
+
509
+ RCT_EXPORT_METHOD(resolveLayout:(NSString *)handle
510
+ evaluate:(BOOL)evaluate
511
+ resolver:(RCTPromiseResolveBlock)resolve
512
+ rejecter:(RCTPromiseRejectBlock)reject)
513
+ {
514
+ std::string handleStr = [self stdStringFromNSString:handle];
515
+
516
+ JsonEvalBridge::resolveLayoutAsync(handleStr, evaluate,
517
+ [resolve, reject](const std::string& result, const std::string& error) {
518
+ if (error.empty()) {
519
+ resolve([NSString stringWithUTF8String:result.c_str()]);
520
+ } else {
521
+ reject(@"RESOLVE_LAYOUT_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
522
+ }
523
+ }
524
+ );
525
+ }
526
+
527
+ RCT_EXPORT_METHOD(compileAndRunLogic:(NSString *)handle
528
+ logicStr:(NSString *)logicStr
529
+ data:(NSString *)data
530
+ context:(NSString *)context
531
+ resolver:(RCTPromiseResolveBlock)resolve
532
+ rejecter:(RCTPromiseRejectBlock)reject)
533
+ {
534
+ std::string handleStr = [self stdStringFromNSString:handle];
535
+ std::string logicString = [self stdStringFromNSString:logicStr];
536
+ std::string dataStr = [self stdStringFromNSString:data];
537
+ std::string contextStr = [self stdStringFromNSString:context];
538
+
539
+ JsonEvalBridge::compileAndRunLogicAsync(handleStr, logicString, dataStr, contextStr,
540
+ [resolve, reject](const std::string& result, const std::string& error) {
541
+ if (error.empty()) {
542
+ resolve([NSString stringWithUTF8String:result.c_str()]);
543
+ } else {
544
+ reject(@"COMPILE_AND_RUN_LOGIC_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
545
+ }
546
+ }
547
+ );
548
+ }
549
+
550
+ // ============================================================================
551
+ // Subform Methods
552
+ // ============================================================================
553
+
554
+ RCT_EXPORT_METHOD(evaluateSubform:(NSString *)handle
555
+ subformPath:(NSString *)subformPath
556
+ data:(NSString *)data
557
+ context:(NSString *)context
558
+ resolver:(RCTPromiseResolveBlock)resolve
559
+ rejecter:(RCTPromiseRejectBlock)reject)
560
+ {
561
+ std::string handleStr = [self stdStringFromNSString:handle];
562
+ std::string pathStr = [self stdStringFromNSString:subformPath];
563
+ std::string dataStr = [self stdStringFromNSString:data];
564
+ std::string contextStr = [self stdStringFromNSString:context];
565
+
566
+ JsonEvalBridge::evaluateSubformAsync(handleStr, pathStr, dataStr, contextStr,
567
+ [resolve, reject](const std::string& result, const std::string& error) {
568
+ if (error.empty()) {
569
+ resolve([NSString stringWithUTF8String:result.c_str()]);
570
+ } else {
571
+ reject(@"EVALUATE_SUBFORM_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
572
+ }
573
+ }
574
+ );
575
+ }
576
+
577
+ RCT_EXPORT_METHOD(validateSubform:(NSString *)handle
578
+ subformPath:(NSString *)subformPath
579
+ data:(NSString *)data
580
+ context:(NSString *)context
581
+ resolver:(RCTPromiseResolveBlock)resolve
582
+ rejecter:(RCTPromiseRejectBlock)reject)
583
+ {
584
+ std::string handleStr = [self stdStringFromNSString:handle];
585
+ std::string pathStr = [self stdStringFromNSString:subformPath];
586
+ std::string dataStr = [self stdStringFromNSString:data];
587
+ std::string contextStr = [self stdStringFromNSString:context];
588
+
589
+ JsonEvalBridge::validateSubformAsync(handleStr, pathStr, dataStr, contextStr,
590
+ [resolve, reject](const std::string& result, const std::string& error) {
591
+ if (error.empty()) {
592
+ resolve([NSString stringWithUTF8String:result.c_str()]);
593
+ } else {
594
+ reject(@"VALIDATE_SUBFORM_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
595
+ }
596
+ }
597
+ );
598
+ }
599
+
600
+ RCT_EXPORT_METHOD(evaluateDependentsSubform:(NSString *)handle
601
+ subformPath:(NSString *)subformPath
602
+ changedPath:(NSString *)changedPath
603
+ data:(NSString *)data
604
+ context:(NSString *)context
605
+ resolver:(RCTPromiseResolveBlock)resolve
606
+ rejecter:(RCTPromiseRejectBlock)reject)
607
+ {
608
+ std::string handleStr = [self stdStringFromNSString:handle];
609
+ std::string subformPathStr = [self stdStringFromNSString:subformPath];
610
+ std::string changedPathStr = [self stdStringFromNSString:changedPath];
611
+ std::string dataStr = [self stdStringFromNSString:data];
612
+ std::string contextStr = [self stdStringFromNSString:context];
613
+
614
+ JsonEvalBridge::evaluateDependentsSubformAsync(handleStr, subformPathStr, changedPathStr, dataStr, contextStr,
615
+ [resolve, reject](const std::string& result, const std::string& error) {
616
+ if (error.empty()) {
617
+ resolve([NSString stringWithUTF8String:result.c_str()]);
618
+ } else {
619
+ reject(@"EVALUATE_DEPENDENTS_SUBFORM_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
620
+ }
621
+ }
622
+ );
623
+ }
624
+
625
+ RCT_EXPORT_METHOD(resolveLayoutSubform:(NSString *)handle
626
+ subformPath:(NSString *)subformPath
627
+ evaluate:(BOOL)evaluate
628
+ resolver:(RCTPromiseResolveBlock)resolve
629
+ rejecter:(RCTPromiseRejectBlock)reject)
630
+ {
631
+ std::string handleStr = [self stdStringFromNSString:handle];
632
+ std::string pathStr = [self stdStringFromNSString:subformPath];
633
+
634
+ JsonEvalBridge::resolveLayoutSubformAsync(handleStr, pathStr, evaluate,
635
+ [resolve, reject](const std::string& result, const std::string& error) {
636
+ if (error.empty()) {
637
+ resolve([NSString stringWithUTF8String:result.c_str()]);
638
+ } else {
639
+ reject(@"RESOLVE_LAYOUT_SUBFORM_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
640
+ }
641
+ }
642
+ );
643
+ }
644
+
645
+ RCT_EXPORT_METHOD(getEvaluatedSchemaSubform:(NSString *)handle
646
+ subformPath:(NSString *)subformPath
647
+ resolveLayout:(BOOL)resolveLayout
648
+ resolver:(RCTPromiseResolveBlock)resolve
649
+ rejecter:(RCTPromiseRejectBlock)reject)
650
+ {
651
+ std::string handleStr = [self stdStringFromNSString:handle];
652
+ std::string pathStr = [self stdStringFromNSString:subformPath];
653
+
654
+ JsonEvalBridge::getEvaluatedSchemaSubformAsync(handleStr, pathStr, resolveLayout,
655
+ [resolve, reject](const std::string& result, const std::string& error) {
656
+ if (error.empty()) {
657
+ resolve([NSString stringWithUTF8String:result.c_str()]);
658
+ } else {
659
+ reject(@"GET_EVALUATED_SCHEMA_SUBFORM_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
660
+ }
661
+ }
662
+ );
663
+ }
664
+
665
+ RCT_EXPORT_METHOD(getSchemaValueSubform:(NSString *)handle
666
+ subformPath:(NSString *)subformPath
667
+ resolver:(RCTPromiseResolveBlock)resolve
668
+ rejecter:(RCTPromiseRejectBlock)reject)
669
+ {
670
+ std::string handleStr = [self stdStringFromNSString:handle];
671
+ std::string pathStr = [self stdStringFromNSString:subformPath];
672
+
673
+ JsonEvalBridge::getSchemaValueSubformAsync(handleStr, pathStr,
674
+ [resolve, reject](const std::string& result, const std::string& error) {
675
+ if (error.empty()) {
676
+ resolve([NSString stringWithUTF8String:result.c_str()]);
677
+ } else {
678
+ reject(@"GET_SCHEMA_VALUE_SUBFORM_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
679
+ }
680
+ }
681
+ );
682
+ }
683
+
684
+ RCT_EXPORT_METHOD(getEvaluatedSchemaWithoutParamsSubform:(NSString *)handle
685
+ subformPath:(NSString *)subformPath
686
+ resolveLayout:(BOOL)resolveLayout
687
+ resolver:(RCTPromiseResolveBlock)resolve
688
+ rejecter:(RCTPromiseRejectBlock)reject)
689
+ {
690
+ std::string handleStr = [self stdStringFromNSString:handle];
691
+ std::string pathStr = [self stdStringFromNSString:subformPath];
692
+
693
+ JsonEvalBridge::getEvaluatedSchemaWithoutParamsSubformAsync(handleStr, pathStr, resolveLayout,
694
+ [resolve, reject](const std::string& result, const std::string& error) {
695
+ if (error.empty()) {
696
+ resolve([NSString stringWithUTF8String:result.c_str()]);
697
+ } else {
698
+ reject(@"GET_EVALUATED_SCHEMA_WITHOUT_PARAMS_SUBFORM_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
699
+ }
700
+ }
701
+ );
702
+ }
703
+
704
+ RCT_EXPORT_METHOD(getEvaluatedSchemaByPathSubform:(NSString *)handle
705
+ subformPath:(NSString *)subformPath
706
+ schemaPath:(NSString *)schemaPath
707
+ skipLayout:(BOOL)skipLayout
708
+ resolver:(RCTPromiseResolveBlock)resolve
709
+ rejecter:(RCTPromiseRejectBlock)reject)
710
+ {
711
+ std::string handleStr = [self stdStringFromNSString:handle];
712
+ std::string subformPathStr = [self stdStringFromNSString:subformPath];
713
+ std::string schemaPathStr = [self stdStringFromNSString:schemaPath];
714
+
715
+ JsonEvalBridge::getEvaluatedSchemaByPathSubformAsync(handleStr, subformPathStr, schemaPathStr, skipLayout,
716
+ [resolve, reject](const std::string& result, const std::string& error) {
717
+ if (error.empty()) {
718
+ resolve([NSString stringWithUTF8String:result.c_str()]);
719
+ } else {
720
+ reject(@"GET_EVALUATED_SCHEMA_BY_PATH_SUBFORM_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
721
+ }
722
+ }
723
+ );
724
+ }
725
+
726
+ RCT_EXPORT_METHOD(getEvaluatedSchemaByPathsSubform:(NSString *)handle
727
+ subformPath:(NSString *)subformPath
728
+ schemaPathsJson:(NSString *)schemaPathsJson
729
+ skipLayout:(BOOL)skipLayout
730
+ resolver:(RCTPromiseResolveBlock)resolve
731
+ rejecter:(RCTPromiseRejectBlock)reject)
732
+ {
733
+ std::string handleStr = [self stdStringFromNSString:handle];
734
+ std::string subformPathStr = [self stdStringFromNSString:subformPath];
735
+ std::string schemaPathsJsonStr = [self stdStringFromNSString:schemaPathsJson];
736
+
737
+ JsonEvalBridge::getEvaluatedSchemaByPathsSubformAsync(handleStr, subformPathStr, schemaPathsJsonStr, skipLayout,
738
+ [resolve, reject](const std::string& result, const std::string& error) {
739
+ if (error.empty()) {
740
+ resolve([NSString stringWithUTF8String:result.c_str()]);
741
+ } else {
742
+ reject(@"GET_EVALUATED_SCHEMA_BY_PATHS_SUBFORM_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
743
+ }
744
+ }
745
+ );
746
+ }
747
+
748
+ RCT_EXPORT_METHOD(getSubformPaths:(NSString *)handle
749
+ resolver:(RCTPromiseResolveBlock)resolve
750
+ rejecter:(RCTPromiseRejectBlock)reject)
751
+ {
752
+ std::string handleStr = [self stdStringFromNSString:handle];
753
+
754
+ JsonEvalBridge::getSubformPathsAsync(handleStr,
755
+ [resolve, reject](const std::string& result, const std::string& error) {
756
+ if (error.empty()) {
757
+ resolve([NSString stringWithUTF8String:result.c_str()]);
758
+ } else {
759
+ reject(@"GET_SUBFORM_PATHS_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
760
+ }
761
+ }
762
+ );
763
+ }
764
+
765
+ RCT_EXPORT_METHOD(getSchemaByPathSubform:(NSString *)handle
766
+ subformPath:(NSString *)subformPath
767
+ schemaPath:(NSString *)schemaPath
768
+ resolver:(RCTPromiseResolveBlock)resolve
769
+ rejecter:(RCTPromiseRejectBlock)reject)
770
+ {
771
+ std::string handleStr = [self stdStringFromNSString:handle];
772
+ std::string subformPathStr = [self stdStringFromNSString:subformPath];
773
+ std::string schemaPathStr = [self stdStringFromNSString:schemaPath];
774
+
775
+ JsonEvalBridge::getSchemaByPathSubformAsync(handleStr, subformPathStr, schemaPathStr,
776
+ [resolve, reject](const std::string& result, const std::string& error) {
777
+ if (error.empty()) {
778
+ resolve([NSString stringWithUTF8String:result.c_str()]);
779
+ } else {
780
+ reject(@"GET_SCHEMA_BY_PATH_SUBFORM_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
781
+ }
782
+ }
783
+ );
784
+ }
785
+
786
+ RCT_EXPORT_METHOD(getSchemaByPathsSubform:(NSString *)handle
787
+ subformPath:(NSString *)subformPath
788
+ schemaPathsJson:(NSString *)schemaPathsJson
789
+ resolver:(RCTPromiseResolveBlock)resolve
790
+ rejecter:(RCTPromiseRejectBlock)reject)
791
+ {
792
+ std::string handleStr = [self stdStringFromNSString:handle];
793
+ std::string subformPathStr = [self stdStringFromNSString:subformPath];
794
+ std::string schemaPathsJsonStr = [self stdStringFromNSString:schemaPathsJson];
795
+
796
+ JsonEvalBridge::getSchemaByPathsSubformAsync(handleStr, subformPathStr, schemaPathsJsonStr,
797
+ [resolve, reject](const std::string& result, const std::string& error) {
798
+ if (error.empty()) {
799
+ resolve([NSString stringWithUTF8String:result.c_str()]);
800
+ } else {
801
+ reject(@"GET_SCHEMA_BY_PATHS_SUBFORM_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
802
+ }
803
+ }
804
+ );
805
+ }
806
+
807
+ RCT_EXPORT_METHOD(hasSubform:(NSString *)handle
808
+ subformPath:(NSString *)subformPath
809
+ resolver:(RCTPromiseResolveBlock)resolve
810
+ rejecter:(RCTPromiseRejectBlock)reject)
811
+ {
812
+ std::string handleStr = [self stdStringFromNSString:handle];
813
+ std::string pathStr = [self stdStringFromNSString:subformPath];
814
+
815
+ JsonEvalBridge::hasSubformAsync(handleStr, pathStr,
816
+ [resolve, reject](const std::string& result, const std::string& error) {
817
+ if (error.empty()) {
818
+ resolve([NSString stringWithUTF8String:result.c_str()]);
819
+ } else {
820
+ reject(@"HAS_SUBFORM_ERROR", [NSString stringWithUTF8String:error.c_str()], nil);
821
+ }
822
+ }
823
+ );
824
+ }
825
+
826
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(dispose:(NSString *)handle)
827
+ {
828
+ std::string handleStr = [self stdStringFromNSString:handle];
829
+ JsonEvalBridge::dispose(handleStr);
830
+ return nil;
831
+ }
832
+
833
+ RCT_EXPORT_METHOD(version:(RCTPromiseResolveBlock)resolve
834
+ rejecter:(RCTPromiseRejectBlock)reject)
835
+ {
836
+ @try {
837
+ std::string ver = JsonEvalBridge::version();
838
+ resolve([self stringFromStdString:ver]);
839
+ } @catch (NSException *exception) {
840
+ reject(@"VERSION_ERROR", exception.reason, nil);
841
+ }
842
+ }
843
+
844
+ RCT_EXPORT_METHOD(multiply:(double)a
845
+ b:(double)b
846
+ resolver:(RCTPromiseResolveBlock)resolve
847
+ rejecter:(RCTPromiseRejectBlock)reject)
848
+ {
849
+ resolve(@(a * b));
850
+ }
851
+
852
+ @end