@@ -334,7 +334,6 @@ inline auto deserialize(simdjson::dom::element parsed, const Parse_Opts& parse_o
334
334
template <typename json_T, bool is_file>
335
335
inline simdjson::simdjson_result<simdjson::dom::element> parse (simdjson::dom::parser& parser,
336
336
const json_T& json) {
337
-
338
337
if constexpr (utils::resembles_vec_raw<json_T>()) {
339
338
/* if `json` is a raw (unsigned char) vector, we can cheat */
340
339
return parser.parse (
@@ -347,16 +346,16 @@ inline simdjson::simdjson_result<simdjson::dom::element> parse(simdjson::dom::pa
347
346
}
348
347
349
348
if constexpr (utils::resembles_r_string<json_T>()) {
350
- if constexpr (is_file) {
349
+ if constexpr (is_file) { /* if `json` is a string and file path...*/
350
+ /* ... check for a `memDecompress()`-compatible file extension... */
351
351
if (const auto file_type = utils::get_memDecompress_type (std::string_view (json))) {
352
352
return parse<Rcpp::RawVector, IS_NOT_FILE>(
353
- parser,
353
+ parser, /* ... and decompress to a RawVector if so, then parse that */
354
354
utils::decompress (std::string (json), Rcpp::String ((*file_type).data ())));
355
- } else { /* no file (compressed) type */
356
- return parser.load (std::string (json));
357
355
}
356
+ return parser.load (std::string (json)); /* otherwise, just `parser::load()` the file */
358
357
} else {
359
- return parser.parse (std::string_view (json));
358
+ return parser.parse (std::string_view (json)); /* if not file, just parse the string */
360
359
}
361
360
}
362
361
}
@@ -372,22 +371,22 @@ inline SEXP query_and_deserialize(simdjson::dom::element p
372
371
}
373
372
374
373
if (query.empty ()) {
374
+ /* if `query` is empty (""), parse/deserialize as if there's no query */
375
375
return deserialize (parsed, parse_opts);
376
376
}
377
377
378
378
if constexpr (query_error_ok) {
379
379
if (auto [queried, query_error] = parsed.at (std::string_view (query)); !query_error) {
380
380
return deserialize (queried, parse_opts);
381
- } else { /* parse_error != simdjson::error_code::SUCCESS */
382
- return on_query_error;
383
381
}
382
+ return on_query_error;
383
+
384
384
} else { /* !query_error_ok */
385
385
auto [queried, query_error] = parsed.at (std::string_view (query));
386
386
if (query_error) {
387
387
Rcpp::stop (simdjson::error_message (query_error));
388
- } else { /* query_error == simdjson::error_code::SUCCESS */
389
- return deserialize (queried, parse_opts);
390
388
}
389
+ return deserialize (queried, parse_opts);
391
390
}
392
391
}
393
392
@@ -404,16 +403,15 @@ inline SEXP parse_and_deserialize(simdjson::dom::parser& p
404
403
if constexpr (parse_error_ok) {
405
404
if (auto [parsed, parse_error] = parse<json_T, is_file>(parser, json); !parse_error) {
406
405
return deserialize (parsed, parse_opts);
407
- } else { /* parse_error == simdjson::error_code::SUCCESS */
408
- return on_parse_error;
409
406
}
407
+ return on_parse_error;
408
+
410
409
} else {
411
410
auto [parsed, parse_error] = parse<json_T, is_file>(parser, json);
412
411
if (parse_error) {
413
412
Rcpp::stop (simdjson::error_message (parse_error));
414
- } else { /* parse_error != simdjson::error_code::SUCCESS */
415
- return deserialize (parsed, parse_opts);
416
413
}
414
+ return deserialize (parsed, parse_opts);
417
415
}
418
416
}
419
417
@@ -432,16 +430,15 @@ inline SEXP parse_query_and_deserialize(simdjson::dom::parser& p
432
430
if constexpr (parse_error_ok) {
433
431
if (auto [parsed, parse_error] = parse<json_T, is_file>(parser, json); !parse_error) {
434
432
return query_and_deserialize<query_error_ok>(parsed, query, on_query_error, parse_opts);
435
- } else { /* parse_error != simdjson::error_code::SUCCESS */
436
- return on_parse_error;
437
433
}
434
+ return on_parse_error;
435
+
438
436
} else {
439
437
auto [parsed, parse_error] = parse<json_T, is_file>(parser, json);
440
438
if (parse_error) {
441
439
Rcpp::stop (simdjson::error_message (parse_error));
442
- } else { /* parse_error == simdjson::error_code::SUCCESS */
443
- return query_and_deserialize<query_error_ok>(parsed, query, on_query_error, parse_opts);
444
440
}
441
+ return query_and_deserialize<query_error_ok>(parsed, query, on_query_error, parse_opts);
445
442
}
446
443
}
447
444
@@ -504,27 +501,22 @@ inline SEXP flat_query(const json_T& json,
504
501
out[i] = query_and_deserialize<query_error_ok>(
505
502
parsed, query[i], on_query_error, parse_opts);
506
503
}
507
-
508
504
out.attr (" names" ) = query.attr (" names" );
509
505
return out;
510
-
511
- } else { /* parse_error != simdjson::error_code::SUCCESS */
512
- return on_parse_error;
513
506
}
507
+ return on_parse_error;
514
508
515
509
} else { /* !parse_error_ok */
516
510
auto [parsed, parse_error] = parse<json_T, is_file>(parser, json);
517
511
if (parse_error) {
518
512
Rcpp::stop (simdjson::error_message (parse_error));
519
- } else { /* parse_error == simdjson::error_code::SUCCESS */
520
- for (R_xlen_t i = 0 ; i < n; ++i) {
521
- out[i] = query_and_deserialize<query_error_ok>(
522
- parsed, query[i], on_query_error, parse_opts);
523
- }
524
-
525
- out.attr (" names" ) = query.attr (" names" );
526
- return out;
527
513
}
514
+ for (R_xlen_t i = 0 ; i < n; ++i) {
515
+ out[i] = query_and_deserialize<query_error_ok>(
516
+ parsed, query[i], on_query_error, parse_opts);
517
+ }
518
+ out.attr (" names" ) = query.attr (" names" );
519
+ return out;
528
520
}
529
521
}
530
522
@@ -540,7 +532,6 @@ inline SEXP flat_query(const json_T& json,
540
532
query_error_ok>(
541
533
parser, json[i], query[0 ], on_parse_error, on_query_error, parse_opts);
542
534
}
543
-
544
535
out.attr (" names" ) = json.attr (" names" );
545
536
return out;
546
537
@@ -592,29 +583,27 @@ inline SEXP nested_query(const json_T& json,
592
583
res[j] = query_and_deserialize<query_error_ok>(
593
584
parsed, query[i][j], on_query_error, parse_opts);
594
585
}
595
-
596
586
res.attr (" names" ) = query[i].attr (" names" );
597
587
out[i] = res;
598
588
}
599
- } else { /* parse_error != simdjson::error_code::SUCCESS */
600
- return on_parse_error;
601
589
}
590
+
591
+ return on_parse_error;
592
+
602
593
} else { /* !parse_error_ok */
603
594
auto [parsed, parse_error] = parse<json_T, is_file>(parser, json);
604
595
if (parse_error) {
605
596
Rcpp::stop (simdjson::error_message (parse_error));
606
- } else { /* parse_error == simdjson::error_code::SUCCESS */
607
- for (R_xlen_t i = 0 ; i < n; ++i) {
608
- const R_xlen_t n_queries = std::size (query[i]);
609
- Rcpp::List res (n_queries);
610
- for (R_xlen_t j = 0 ; j < std::size (query[i]); ++j) {
611
- res[j] = query_and_deserialize<query_error_ok>(
612
- parsed, query[i][j], on_query_error, parse_opts);
613
- }
614
-
615
- res.attr (" names" ) = query[i].attr (" names" );
616
- out[i] = res;
597
+ }
598
+ for (R_xlen_t i = 0 ; i < n; ++i) {
599
+ const R_xlen_t n_queries = std::size (query[i]);
600
+ Rcpp::List res (n_queries);
601
+ for (R_xlen_t j = 0 ; j < std::size (query[i]); ++j) {
602
+ res[j] = query_and_deserialize<query_error_ok>(
603
+ parsed, query[i][j], on_query_error, parse_opts);
617
604
}
605
+ res.attr (" names" ) = query[i].attr (" names" );
606
+ out[i] = res;
618
607
}
619
608
}
620
609
@@ -631,25 +620,25 @@ inline SEXP nested_query(const json_T& json,
631
620
}
632
621
res.attr (" names" ) = query[i].attr (" names" );
633
622
out[i] = res;
634
- } else { /* parse_error != simdjson::error_code::SUCCESS */
635
- out[i] = on_parse_error;
636
623
}
624
+ out[i] = on_parse_error;
625
+
637
626
} else { /* !parse_error_ok */
638
627
auto [parsed, parse_error] = parse<decltype (json[i]), is_file>(parser, json[i]);
639
628
if (parse_error) {
640
629
Rcpp::stop (simdjson::error_message (parse_error));
641
- } else { /* parse_error == simdjson::error_code::SUCCESS */
642
- Rcpp::List res (n_queries);
643
- for (R_xlen_t j = 0 ; j < n_queries; ++j) {
644
- res[j] = query_and_deserialize<query_error_ok>(
645
- parsed, query[i][j], on_query_error, parse_opts);
646
- }
647
- res.attr (" names" ) = query[i].attr (" names" );
648
- out[i] = res;
649
630
}
631
+ Rcpp::List res (n_queries);
632
+ for (R_xlen_t j = 0 ; j < n_queries; ++j) {
633
+ res[j] = query_and_deserialize<query_error_ok>(
634
+ parsed, query[i][j], on_query_error, parse_opts);
635
+ }
636
+ res.attr (" names" ) = query[i].attr (" names" );
637
+ out[i] = res;
650
638
}
651
639
}
652
640
}
641
+
653
642
if (utils::is_named (query)) {
654
643
out.attr (" names" ) = query.attr (" names" );
655
644
} else {
0 commit comments