1#[macro_export(local_inner_macros)]
84macro_rules! json {
85 ($($json:tt)+) => {
87 json_internal_owned!($($json)+)
88 };
89}
90
91#[macro_export(local_inner_macros)]
197macro_rules! json_typed {
198 (owned, $($json:tt)+) => {
199 json_internal_owned!($($json)+)
200 };
201 (borrowed, $($json:tt)+) => {
202 json_internal_borrowed!($($json)+)
203 };
204
205}
206
207#[cfg(feature = "serde_impl")]
215#[macro_export(local_inner_macros)]
216#[doc(hidden)]
217macro_rules! json_internal_owned {
218 (@array [$($elems:expr,)*]) => {
227 json_internal_vec![$($elems,)*]
228 };
229
230 (@array [$($elems:expr),*]) => {
232 json_internal_vec![$($elems),*]
233 };
234
235 (@array [$($elems:expr,)*] null $($rest:tt)*) => {
237 json_internal_owned!(@array [$($elems,)* json_internal_owned!(null)] $($rest)*)
238 };
239
240 (@array [$($elems:expr,)*] true $($rest:tt)*) => {
242 json_internal_owned!(@array [$($elems,)* json_internal_owned!(true)] $($rest)*)
243 };
244
245 (@array [$($elems:expr,)*] false $($rest:tt)*) => {
247 json_internal_owned!(@array [$($elems,)* json_internal_owned!(false)] $($rest)*)
248 };
249
250 (@array [$($elems:expr,)*] [$($array:tt)*] $($rest:tt)*) => {
252 json_internal_owned!(@array [$($elems,)* json_internal_owned!([$($array)*])] $($rest)*)
253 };
254
255 (@array [$($elems:expr,)*] {$($map:tt)*} $($rest:tt)*) => {
257 json_internal_owned!(@array [$($elems,)* json_internal_owned!({$($map)*})] $($rest)*)
258 };
259
260 (@array [$($elems:expr,)*] $next:expr, $($rest:tt)*) => {
262 json_internal_owned!(@array [$($elems,)* json_internal_owned!($next),] $($rest)*)
263 };
264
265 (@array [$($elems:expr,)*] $last:expr) => {
267 json_internal_owned!(@array [$($elems,)* json_internal_owned!($last)])
268 };
269
270 (@array [$($elems:expr),*] , $($rest:tt)*) => {
272 json_internal_owned!(@array [$($elems,)*] $($rest)*)
273 };
274
275 (@array [$($elems:expr),*] $unexpected:tt $($rest:tt)*) => {
277 json_unexpected!($unexpected)
278 };
279
280 (@object $object:ident [@entries] () () ()) => {};
294
295 (@object @count [@entries $(($value:expr => $($key:tt)+))*]) => {
298 <[()]>::len(&[$(json_internal_owned!(@object @count @single ($($key)+))),*])
299 };
300 (@object @count @single ($($key:tt)+)) => {()};
301
302 (@object $object:ident [@entries $(($value:expr => $($key:tt)+))*] () () ()) => {
304 let len = json_internal_owned!(@object @count [@entries $(($value => $($key)+))*]);
305 $object = $crate::value::owned::Object::with_capacity_and_hasher(len, $crate::value::ObjectHasher::default());
306 $(
307 #[allow(clippy::let_underscore_drop)]
308 let _: Option<_> = $object.insert(($($key)+).into(), $value);
309 )*
310 };
311
312 (@object $object:ident [@entries $($entries:tt)*] [$($key:tt)+] ($value:expr) , $($rest:tt)*) => {
318 json_internal_owned!(@object $object [@entries $($entries)* ($value => $($key)+) ] () ($($rest)*) ($($rest)*));
319 };
320
321 (@object $object:ident [@entries $($entries:tt)*] [$($key:tt)+] ($value:expr)) => {
324 json_internal_owned!(@object $object [@entries $($entries)* ($value => $($key)+) ] () () ());
325 };
326
327 (@object $object:ident [@entries $($entries:tt)*] [$($key:tt)+] ($value:expr) $unexpected:tt $($rest:tt)*) => {
329 json_unexpected!($unexpected);
330 };
331
332
333 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: null $($rest:tt)*) $copy:tt) => {
335 json_internal_owned!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_owned!(null)) $($rest)*);
336 };
337
338 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: true $($rest:tt)*) $copy:tt) => {
340 json_internal_owned!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_owned!(true)) $($rest)*);
341 };
342
343 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: false $($rest:tt)*) $copy:tt) => {
345 json_internal_owned!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_owned!(false)) $($rest)*);
346 };
347
348 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: [$($array:tt)*] $($rest:tt)*) $copy:tt) => {
350 json_internal_owned!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_owned!([$($array)*])) $($rest)*);
351 };
352
353 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: {$($map:tt)*} $($rest:tt)*) $copy:tt) => {
355 json_internal_owned!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_owned!({$($map)*})) $($rest)*);
356 };
357
358 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: $value:expr , $($rest:tt)*) $copy:tt) => {
360 json_internal_owned!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_owned!($value)) , $($rest)*);
361 };
362
363 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: $value:expr) $copy:tt) => {
365 json_internal_owned!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_owned!($value)));
366 };
367
368 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (:) $copy:tt) => {
370 json_internal_owned!();
372 };
373
374 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) () $copy:tt) => {
377 json_internal_owned!();
379 };
380
381 (@object $object:ident [@entries $($entries:tt)*] () (: $($rest:tt)*) ($colon:tt $($copy:tt)*)) => {
383 json_unexpected!($colon);
385 };
386
387 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)*) (, $($rest:tt)*) ($comma:tt $($copy:tt)*)) => {
389 json_unexpected!($comma);
391 };
392
393 (@object $object:ident [@entries $($entries:tt)*] () (($key:expr) : $($rest:tt)*) $copy:tt) => {
396 json_internal_owned!(@object $object [@entries $($entries)*] ($key) (: $($rest)*) (: $($rest)*));
397 };
398
399 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)*) ($tt:tt $($rest:tt)*) $copy:tt) => {
401 json_internal_owned!(@object $object [@entries $($entries)*] ($($key)* $tt) ($($rest)*) ($($rest)*));
402 };
403
404 (null) => {
411 $crate::value::owned::Value::Static($crate::StaticNode::Null)
412 };
413
414 (true) => {
415 $crate::value::owned::Value::Static($crate::StaticNode::Bool(true))
416 };
417
418 (false) => {
419 $crate::value::owned::Value::Static($crate::StaticNode::Bool(false))
420 };
421
422 ([]) => {
423 $crate::value::owned::Value::Array(Box::new(json_internal_vec![]))
424 };
425
426 ([ $($tt:tt)+ ]) => {
427 $crate::value::owned::Value::Array(Box::new(json_internal_owned!(@array [] $($tt)+)))
428 };
429
430 ({}) => {
431 {
432 use $crate::value::ValueBuilder;
433 $crate::value::owned::Value::object()
434 }
435 };
436
437 ({ $($tt:tt)+ }) => {
438 $crate::value::owned::Value::from({
439 let mut object;
440 json_internal_owned!(@object object [@entries] () ($($tt)+) ($($tt)+));
441 object
442 })
443 };
444
445 ($other:expr) => {
448 $crate::serde::to_owned_value(&$other).expect("serde::to_owned_value")
449 };
450}
451
452#[cfg(not(feature = "serde_impl"))]
453#[macro_export(local_inner_macros)]
454#[doc(hidden)]
455macro_rules! json_internal_owned {
456 (@array [$($elems:expr,)*]) => {
465 json_internal_vec![$($elems,)*]
466 };
467
468 (@array [$($elems:expr),*]) => {
470 json_internal_vec![$($elems),*]
471 };
472
473 (@array [$($elems:expr,)*] null $($rest:tt)*) => {
475 json_internal_owned!(@array [$($elems,)* json_internal_owned!(null)] $($rest)*)
476 };
477
478 (@array [$($elems:expr,)*] true $($rest:tt)*) => {
480 json_internal_owned!(@array [$($elems,)* json_internal_owned!(true)] $($rest)*)
481 };
482
483 (@array [$($elems:expr,)*] false $($rest:tt)*) => {
485 json_internal_owned!(@array [$($elems,)* json_internal_owned!(false)] $($rest)*)
486 };
487
488 (@array [$($elems:expr,)*] [$($array:tt)*] $($rest:tt)*) => {
490 json_internal_owned!(@array [$($elems,)* json_internal_owned!([$($array)*])] $($rest)*)
491 };
492
493 (@array [$($elems:expr,)*] {$($map:tt)*} $($rest:tt)*) => {
495 json_internal_owned!(@array [$($elems,)* json_internal_owned!({$($map)*})] $($rest)*)
496 };
497
498 (@array [$($elems:expr,)*] $next:expr, $($rest:tt)*) => {
500 json_internal_owned!(@array [$($elems,)* json_internal_owned!($next),] $($rest)*)
501 };
502
503 (@array [$($elems:expr,)*] $last:expr) => {
505 json_internal_owned!(@array [$($elems,)* json_internal_owned!($last)])
506 };
507
508 (@array [$($elems:expr),*] , $($rest:tt)*) => {
510 json_internal_owned!(@array [$($elems,)*] $($rest)*)
511 };
512
513 (@array [$($elems:expr),*] $unexpected:tt $($rest:tt)*) => {
515 json_unexpected!($unexpected)
516 };
517
518 (@object $object:ident [@entries] () () ()) => {};
532
533 (@object @count [@entries $(($value:expr => $($key:tt)+))*]) => {
536 <[()]>::len(&[$(json_internal_owned!(@object @count @single ($($key)+))),*])
537 };
538 (@object @count @single ($($key:tt)+)) => {()};
539
540 (@object $object:ident [@entries $(($value:expr => $($key:tt)+))*] () () ()) => {
542 let len = json_internal_owned!(@object @count [@entries $(($value => $($key)+))*]);
543 $object = $crate::value::owned::Object::with_capacity_and_hasher(len, $crate::value::ObjectHasher::default());
544 $(
545 #[allow(clippy::let_underscore_drop)]
546 let _: Option<_> = $object.insert(($($key)+).into(), $value);
547 )*
548 };
549
550 (@object $object:ident [@entries $($entries:tt)*] [$($key:tt)+] ($value:expr) , $($rest:tt)*) => {
556 json_internal_owned!(@object $object [@entries $($entries)* ($value => $($key)+) ] () ($($rest)*) ($($rest)*));
557 };
558
559 (@object $object:ident [@entries $($entries:tt)*] [$($key:tt)+] ($value:expr)) => {
562 json_internal_owned!(@object $object [@entries $($entries)* ($value => $($key)+) ] () () ());
563 };
564
565 (@object $object:ident [@entries $($entries:tt)*] [$($key:tt)+] ($value:expr) $unexpected:tt $($rest:tt)*) => {
567 json_unexpected!($unexpected);
568 };
569
570
571 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: null $($rest:tt)*) $copy:tt) => {
573 json_internal_owned!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_owned!(null)) $($rest)*);
574 };
575
576 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: true $($rest:tt)*) $copy:tt) => {
578 json_internal_owned!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_owned!(true)) $($rest)*);
579 };
580
581 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: false $($rest:tt)*) $copy:tt) => {
583 json_internal_owned!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_owned!(false)) $($rest)*);
584 };
585
586 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: [$($array:tt)*] $($rest:tt)*) $copy:tt) => {
588 json_internal_owned!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_owned!([$($array)*])) $($rest)*);
589 };
590
591 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: {$($map:tt)*} $($rest:tt)*) $copy:tt) => {
593 json_internal_owned!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_owned!({$($map)*})) $($rest)*);
594 };
595
596 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: $value:expr , $($rest:tt)*) $copy:tt) => {
598 json_internal_owned!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_owned!($value)) , $($rest)*);
599 };
600
601 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: $value:expr) $copy:tt) => {
603 json_internal_owned!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_owned!($value)));
604 };
605
606 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (:) $copy:tt) => {
608 json_internal_owned!();
610 };
611
612 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) () $copy:tt) => {
615 json_internal_owned!();
617 };
618
619 (@object $object:ident [@entries $($entries:tt)*] () (: $($rest:tt)*) ($colon:tt $($copy:tt)*)) => {
621 json_unexpected!($colon);
623 };
624
625 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)*) (, $($rest:tt)*) ($comma:tt $($copy:tt)*)) => {
627 json_unexpected!($comma);
629 };
630
631 (@object $object:ident [@entries $($entries:tt)*] () (($key:expr) : $($rest:tt)*) $copy:tt) => {
634 json_internal_owned!(@object $object [@entries $($entries)*] ($key) (: $($rest)*) (: $($rest)*));
635 };
636
637 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)*) ($tt:tt $($rest:tt)*) $copy:tt) => {
639 json_internal_owned!(@object $object [@entries $($entries)*] ($($key)* $tt) ($($rest)*) ($($rest)*));
640 };
641
642 (null) => {
649 $crate::value::owned::Value::Static($crate::StaticNode::Null)
650 };
651
652 (true) => {
653 $crate::value::owned::Value::Static($crate::StaticNode::Bool(true))
654 };
655
656 (false) => {
657 $crate::value::owned::Value::Static($crate::StaticNode::Bool(false))
658 };
659
660 ([]) => {
661 $crate::value::owned::Value::Array(Box::new(json_internal_vec![]))
662 };
663
664 ([ $($tt:tt)+ ]) => {
665 $crate::value::owned::Value::Array(Box::new(json_internal_owned!(@array [] $($tt)+)))
666 };
667
668 ({}) => {
669 {
670 use $crate::value::ValueBuilder;
671 $crate::value::owned::Value::object()
672 }
673 };
674
675 ({ $($tt:tt)+ }) => {
676 $crate::value::owned::Value::from({
677 let mut object;
678 json_internal_owned!(@object object [@entries] () ($($tt)+) ($($tt)+));
679 object
680 })
681 };
682
683 ($other:expr) => {
686 $crate::value::owned::Value::from($other)
687 };
688}
689
690#[cfg(feature = "serde_impl")]
698#[macro_export(local_inner_macros)]
699#[doc(hidden)]
700macro_rules! json_internal_borrowed {
701 (@array [$($elems:expr,)*]) => {
710 json_internal_vec![$($elems,)*]
711 };
712
713 (@array [$($elems:expr),*]) => {
715 json_internal_vec![$($elems),*]
716 };
717
718 (@array [$($elems:expr,)*] null $($rest:tt)*) => {
720 json_internal_borrowed!(@array [$($elems,)* json_internal_borrowed!(null)] $($rest)*)
721 };
722
723 (@array [$($elems:expr,)*] true $($rest:tt)*) => {
725 json_internal_borrowed!(@array [$($elems,)* json_internal_borrowed!(true)] $($rest)*)
726 };
727
728 (@array [$($elems:expr,)*] false $($rest:tt)*) => {
730 json_internal_borrowed!(@array [$($elems,)* json_internal_borrowed!(false)] $($rest)*)
731 };
732
733 (@array [$($elems:expr,)*] [$($array:tt)*] $($rest:tt)*) => {
735 json_internal_borrowed!(@array [$($elems,)* json_internal_borrowed!([$($array)*])] $($rest)*)
736 };
737
738 (@array [$($elems:expr,)*] {$($map:tt)*} $($rest:tt)*) => {
740 json_internal_borrowed!(@array [$($elems,)* json_internal_borrowed!({$($map)*})] $($rest)*)
741 };
742
743 (@array [$($elems:expr,)*] $next:expr, $($rest:tt)*) => {
745 json_internal_borrowed!(@array [$($elems,)* json_internal_borrowed!($next),] $($rest)*)
746 };
747
748 (@array [$($elems:expr,)*] $last:expr) => {
750 json_internal_borrowed!(@array [$($elems,)* json_internal_borrowed!($last)])
751 };
752
753 (@array [$($elems:expr),*] , $($rest:tt)*) => {
755 json_internal_borrowed!(@array [$($elems,)*] $($rest)*)
756 };
757
758 (@array [$($elems:expr),*] $unexpected:tt $($rest:tt)*) => {
760 json_unexpected!($unexpected)
761 };
762
763 (@object $object:ident [@entries] () () ()) => {};
777
778 (@object @count [@entries $(($value:expr => $($key:tt)+))*]) => {
781 <[()]>::len(&[$(json_internal_borrowed!(@object @count @single ($($key)+))),*])
782 };
783 (@object @count @single ($($key:tt)+)) => {()};
784
785 (@object $object:ident [@entries $(($value:expr => $($key:tt)+))*] () () ()) => {
787 let len = json_internal_borrowed!(@object @count [@entries $(($value => $($key)+))*]);
788
789 $object = $crate::value::borrowed::Object::with_capacity_and_hasher(len, $crate::value::ObjectHasher::default());
790 $(
791 #[allow(clippy::let_underscore_drop)]
792 let _:Option<_> = $object.insert(($($key)+).into(), $value);
793 )*
794
795 };
796
797 (@object $object:ident [@entries $($entries:tt)*] [$($key:tt)+] ($value:expr) , $($rest:tt)*) => {
803 json_internal_borrowed!(@object $object [@entries $($entries)* ($value => $($key)+) ] () ($($rest)*) ($($rest)*));
804 };
805
806 (@object $object:ident [@entries $($entries:tt)*] [$($key:tt)+] ($value:expr)) => {
809 json_internal_borrowed!(@object $object [@entries $($entries)* ($value => $($key)+) ] () () ());
810 };
811
812 (@object $object:ident [@entries $($entries:tt)*] [$($key:tt)+] ($value:expr) $unexpected:tt $($rest:tt)*) => {
814 json_unexpected!($unexpected);
815 };
816
817
818 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: null $($rest:tt)*) $copy:tt) => {
820 json_internal_borrowed!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_borrowed!(null)) $($rest)*);
821 };
822
823 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: true $($rest:tt)*) $copy:tt) => {
825 json_internal_borrowed!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_borrowed!(true)) $($rest)*);
826 };
827
828 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: false $($rest:tt)*) $copy:tt) => {
830 json_internal_borrowed!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_borrowed!(false)) $($rest)*);
831 };
832
833 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: [$($array:tt)*] $($rest:tt)*) $copy:tt) => {
835 json_internal_borrowed!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_borrowed!([$($array)*])) $($rest)*);
836 };
837
838 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: {$($map:tt)*} $($rest:tt)*) $copy:tt) => {
840 json_internal_borrowed!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_borrowed!({$($map)*})) $($rest)*);
841 };
842
843 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: $value:expr , $($rest:tt)*) $copy:tt) => {
845 json_internal_borrowed!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_borrowed!($value)) , $($rest)*);
846 };
847
848 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: $value:expr) $copy:tt) => {
850 json_internal_borrowed!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_borrowed!($value)));
851 };
852
853 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (:) $copy:tt) => {
855 json_internal_borrowed!();
857 };
858
859 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) () $copy:tt) => {
862 json_internal_borrowed!();
864 };
865
866 (@object $object:ident [@entries $($entries:tt)*] () (: $($rest:tt)*) ($colon:tt $($copy:tt)*)) => {
868 json_unexpected!($colon);
870 };
871
872 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)*) (, $($rest:tt)*) ($comma:tt $($copy:tt)*)) => {
874 json_unexpected!($comma);
876 };
877
878 (@object $object:ident [@entries $($entries:tt)*] () (($key:expr) : $($rest:tt)*) $copy:tt) => {
881 json_internal_borrowed!(@object $object [@entries $($entries)*] ($key) (: $($rest)*) (: $($rest)*));
882 };
883
884 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)*) ($tt:tt $($rest:tt)*) $copy:tt) => {
886 json_internal_borrowed!(@object $object [@entries $($entries)*] ($($key)* $tt) ($($rest)*) ($($rest)*));
887 };
888
889 (null) => {
896 $crate::value::borrowed::Value::Static($crate::StaticNode::Null)
897 };
898
899 (true) => {
900 $crate::value::borrowed::Value::Static($crate::StaticNode::Bool(true))
901 };
902
903 (false) => {
904 $crate::value::borrowed::Value::Static($crate::StaticNode::Bool(false))
905 };
906
907 ([]) => {
908 $crate::value::borrowed::Value::Array(Box::new(json_internal_vec![]))
909 };
910
911 ([ $($tt:tt)+ ]) => {
912 $crate::value::borrowed::Value::Array(Box::new(json_internal_borrowed!(@array [] $($tt)+)))
913 };
914
915 ({}) => {
916 {
917 use $crate::value::ValueBuilder;
918 $crate::value::borrowed::Value::object()
919 }
920 };
921
922 ({ $($tt:tt)+ }) => {
923 $crate::value::borrowed::Value::from({
924 let mut object;
925 json_internal_borrowed!(@object object [@entries] () ($($tt)+) ($($tt)+));
926 object
927 })
928 };
929
930 ($other:expr) => {
933 $crate::serde::to_borrowed_value(&$other).expect("serde::to_borrowed_value")
934 };
935}
936
937#[cfg(not(feature = "serde_impl"))]
938#[macro_export(local_inner_macros)]
939#[doc(hidden)]
940macro_rules! json_internal_borrowed {
941 (@array [$($elems:expr,)*]) => {
950 json_internal_vec![$($elems,)*]
951 };
952
953 (@array [$($elems:expr),*]) => {
955 json_internal_vec![$($elems),*]
956 };
957
958 (@array [$($elems:expr,)*] null $($rest:tt)*) => {
960 json_internal_borrowed!(@array [$($elems,)* json_internal_borrowed!(null)] $($rest)*)
961 };
962
963 (@array [$($elems:expr,)*] true $($rest:tt)*) => {
965 json_internal_borrowed!(@array [$($elems,)* json_internal_borrowed!(true)] $($rest)*)
966 };
967
968 (@array [$($elems:expr,)*] false $($rest:tt)*) => {
970 json_internal_borrowed!(@array [$($elems,)* json_internal_borrowed!(false)] $($rest)*)
971 };
972
973 (@array [$($elems:expr,)*] [$($array:tt)*] $($rest:tt)*) => {
975 json_internal_borrowed!(@array [$($elems,)* json_internal_borrowed!([$($array)*])] $($rest)*)
976 };
977
978 (@array [$($elems:expr,)*] {$($map:tt)*} $($rest:tt)*) => {
980 json_internal_borrowed!(@array [$($elems,)* json_internal_borrowed!({$($map)*})] $($rest)*)
981 };
982
983 (@array [$($elems:expr,)*] $next:expr, $($rest:tt)*) => {
985 json_internal_borrowed!(@array [$($elems,)* json_internal_borrowed!($next),] $($rest)*)
986 };
987
988 (@array [$($elems:expr,)*] $last:expr) => {
990 json_internal_borrowed!(@array [$($elems,)* json_internal_borrowed!($last)])
991 };
992
993 (@array [$($elems:expr),*] , $($rest:tt)*) => {
995 json_internal_borrowed!(@array [$($elems,)*] $($rest)*)
996 };
997
998 (@array [$($elems:expr),*] $unexpected:tt $($rest:tt)*) => {
1000 json_unexpected!($unexpected)
1001 };
1002
1003 (@object $object:ident [@entries] () () ()) => {};
1017
1018 (@object @count [@entries $(($value:expr => $($key:tt)+))*]) => {
1021 <[()]>::len(&[$(json_internal_borrowed!(@object @count @single ($($key)+))),*])
1022 };
1023 (@object @count @single ($($key:tt)+)) => {()};
1024
1025 (@object $object:ident [@entries $(($value:expr => $($key:tt)+))*] () () ()) => {
1027 let len = json_internal_borrowed!(@object @count [@entries $(($value => $($key)+))*]);
1028
1029 $object = $crate::value::borrowed::Object::with_capacity_and_hasher(len, $crate::value::ObjectHasher::default());
1030 $(
1031 #[allow(clippy::let_underscore_drop)]
1032 let _:Option<_> = $object.insert(($($key)+).into(), $value);
1033 )*
1034
1035 };
1036
1037 (@object $object:ident [@entries $($entries:tt)*] [$($key:tt)+] ($value:expr) , $($rest:tt)*) => {
1043 json_internal_borrowed!(@object $object [@entries $($entries)* ($value => $($key)+) ] () ($($rest)*) ($($rest)*));
1044 };
1045
1046 (@object $object:ident [@entries $($entries:tt)*] [$($key:tt)+] ($value:expr)) => {
1049 json_internal_borrowed!(@object $object [@entries $($entries)* ($value => $($key)+) ] () () ());
1050 };
1051
1052 (@object $object:ident [@entries $($entries:tt)*] [$($key:tt)+] ($value:expr) $unexpected:tt $($rest:tt)*) => {
1054 json_unexpected!($unexpected);
1055 };
1056
1057
1058 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: null $($rest:tt)*) $copy:tt) => {
1060 json_internal_borrowed!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_borrowed!(null)) $($rest)*);
1061 };
1062
1063 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: true $($rest:tt)*) $copy:tt) => {
1065 json_internal_borrowed!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_borrowed!(true)) $($rest)*);
1066 };
1067
1068 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: false $($rest:tt)*) $copy:tt) => {
1070 json_internal_borrowed!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_borrowed!(false)) $($rest)*);
1071 };
1072
1073 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: [$($array:tt)*] $($rest:tt)*) $copy:tt) => {
1075 json_internal_borrowed!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_borrowed!([$($array)*])) $($rest)*);
1076 };
1077
1078 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: {$($map:tt)*} $($rest:tt)*) $copy:tt) => {
1080 json_internal_borrowed!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_borrowed!({$($map)*})) $($rest)*);
1081 };
1082
1083 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: $value:expr , $($rest:tt)*) $copy:tt) => {
1085 json_internal_borrowed!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_borrowed!($value)) , $($rest)*);
1086 };
1087
1088 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (: $value:expr) $copy:tt) => {
1090 json_internal_borrowed!(@object $object [@entries $($entries)*] [$($key)+] (json_internal_borrowed!($value)));
1091 };
1092
1093 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) (:) $copy:tt) => {
1095 json_internal_borrowed!();
1097 };
1098
1099 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)+) () $copy:tt) => {
1102 json_internal_borrowed!();
1104 };
1105
1106 (@object $object:ident [@entries $($entries:tt)*] () (: $($rest:tt)*) ($colon:tt $($copy:tt)*)) => {
1108 json_unexpected!($colon);
1110 };
1111
1112 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)*) (, $($rest:tt)*) ($comma:tt $($copy:tt)*)) => {
1114 json_unexpected!($comma);
1116 };
1117
1118 (@object $object:ident [@entries $($entries:tt)*] () (($key:expr) : $($rest:tt)*) $copy:tt) => {
1121 json_internal_borrowed!(@object $object [@entries $($entries)*] ($key) (: $($rest)*) (: $($rest)*));
1122 };
1123
1124 (@object $object:ident [@entries $($entries:tt)*] ($($key:tt)*) ($tt:tt $($rest:tt)*) $copy:tt) => {
1126 json_internal_borrowed!(@object $object [@entries $($entries)*] ($($key)* $tt) ($($rest)*) ($($rest)*));
1127 };
1128
1129 (null) => {
1136 $crate::value::borrowed::Value::Static($crate::StaticNode::Null)
1137 };
1138
1139 (true) => {
1140 $crate::value::borrowed::Value::Static($crate::StaticNode::Bool(true))
1141 };
1142
1143 (false) => {
1144 $crate::value::borrowed::Value::Static($crate::StaticNode::Bool(false))
1145 };
1146
1147 ([]) => {
1148 $crate::value::borrowed::Value::Array(Box::new(json_internal_vec![]))
1149 };
1150
1151 ([ $($tt:tt)+ ]) => {
1152 $crate::value::borrowed::Value::Array(Box::new(json_internal_borrowed!(@array [] $($tt)+)))
1153 };
1154
1155 ({}) => {
1156 {
1157 use $crate::value::ValueBuilder;
1158 $crate::value::borrowed::Value::object()
1159 }
1160 };
1161
1162 ({ $($tt:tt)+ }) => {
1163 $crate::value::borrowed::Value::from({
1164 let mut object;
1165 json_internal_borrowed!(@object object [@entries] () ($($tt)+) ($($tt)+));
1166 object
1167 })
1168 };
1169
1170 ($other:expr) => {
1173 $crate::value::borrowed::Value::from($other)
1174 };
1175}
1176
1177#[macro_export]
1181#[doc(hidden)]
1182macro_rules! json_internal_vec {
1183 ($($content:tt)*) => {
1184 vec![$($content)*]
1185 };
1186}
1187
1188#[macro_export]
1189#[doc(hidden)]
1190macro_rules! json_unexpected {
1191 () => {};
1192}
1193
1194#[cfg(feature = "hints")]
1196#[macro_export]
1197macro_rules! likely {
1198 ($e:expr) => {
1199 ::std::intrinsics::likely($e)
1200 };
1201}
1202
1203#[cfg(feature = "hints")]
1205#[macro_export]
1206macro_rules! unlikely {
1207 ($e:expr) => {{
1208 ::std::intrinsics::unlikely($e)
1209 }};
1210}
1211
1212#[cfg(not(feature = "hints"))]
1216#[macro_export]
1217macro_rules! likely {
1218 ($e:expr) => {{
1219 #[inline]
1220 #[cold]
1221 fn cold() {}
1222
1223 let cond = $e;
1224
1225 if !cond {
1226 cold();
1227 }
1228
1229 cond
1230 }};
1231}
1232
1233#[cfg(not(feature = "hints"))]
1237#[macro_export]
1238macro_rules! unlikely {
1239 ($e:expr) => {{
1240 #[inline]
1241 #[cold]
1242 fn cold() {}
1243
1244 let cond = $e;
1245
1246 if cond {
1247 cold();
1248 }
1249
1250 cond
1251 }};
1252}
1253
1254#[macro_export]
1256macro_rules! static_cast_i8 {
1257 ($v:expr) => {
1258 ::std::transmute::<_, i8>($v)
1259 };
1260}
1261
1262#[macro_export]
1264macro_rules! static_cast_i32 {
1265 ($v:expr) => {
1266 ::std::mem::transmute::<u32, i32>($v)
1267 };
1268}
1269
1270#[macro_export]
1272macro_rules! static_cast_u32 {
1273 ($v:expr) => {
1274 ::std::mem::transmute::<_, u32>($v)
1275 };
1276}
1277
1278#[macro_export]
1280macro_rules! static_cast_i64 {
1281 ($v:expr) => {
1282 ::std::mem::transmute::<u64, i64>($v)
1283 };
1284}
1285
1286#[macro_export]
1288macro_rules! static_cast_i128 {
1289 ($v:expr) => {
1290 ::std::mem::transmute::<_, i128>($v)
1291 };
1292}
1293
1294#[macro_export]
1296macro_rules! static_cast_u64 {
1297 ($v:expr) => {
1298 ::std::mem::transmute::<i64, u64>($v)
1299 };
1300}
1301
1302#[macro_export]
1308macro_rules! stry {
1309 ($e:expr) => {
1310 match $e {
1311 ::std::result::Result::Ok(val) => val,
1312 ::std::result::Result::Err(err) => return ::std::result::Result::Err(err),
1313 }
1314 };
1315}
1316
1317#[cfg(test)]
1318mod test {
1319 use crate::prelude::*;
1320 use crate::{BorrowedValue, OwnedValue};
1321
1322 #[cfg(feature = "serde_impl")]
1323 fn owned_test_map() -> OwnedValue {
1324 let mut h = crate::owned::Object::with_hasher(crate::ObjectHasher::default());
1325 h.insert("test".into(), 1.into());
1326 OwnedValue::from(h)
1327 }
1328 #[cfg(feature = "serde_impl")]
1329 fn borrowed_test_map() -> BorrowedValue<'static> {
1330 let mut h = crate::borrowed::Object::with_hasher(crate::ObjectHasher::default());
1331 h.insert("test".into(), 1.into());
1332 BorrowedValue::from(h)
1333 }
1334
1335 #[test]
1336 fn array() {
1337 let v: OwnedValue = json!(vec![1]);
1338 assert_eq!(OwnedValue::from(vec![1_u64]), v);
1339 let v: OwnedValue = json!([1]);
1340 assert_eq!(BorrowedValue::from(vec![1_u64]), v);
1341 let v: OwnedValue = json!([]);
1342 assert_eq!(OwnedValue::array(), v);
1343 }
1344
1345 #[cfg(feature = "serde_impl")]
1346 #[test]
1347 fn obj() {
1348 use halfbrown::hashmap;
1349 let o = owned_test_map();
1350 let v: OwnedValue = json!(hashmap! {"test" => 1});
1351 assert_eq!(o, v);
1352 let v: OwnedValue = json!({"test": 1});
1353 assert_eq!(o, v);
1354 let v: OwnedValue = json!({});
1355 assert_eq!(OwnedValue::object(), v);
1356 }
1357
1358 #[test]
1359 fn array_typed_owned() {
1360 let v: OwnedValue = json_typed!(owned, vec![1]);
1361 assert_eq!(OwnedValue::from(vec![1_u64]), v);
1362 let v: OwnedValue = json_typed!(owned, [1]);
1363 assert_eq!(OwnedValue::from(vec![1_u64]), v);
1364 let v: OwnedValue = json_typed!(owned, []);
1365 assert_eq!(OwnedValue::array(), v);
1366 }
1367
1368 #[test]
1369 fn array_typed_borrowed() {
1370 let v: BorrowedValue = json_typed!(borrowed, vec![1]);
1371 assert_eq!(BorrowedValue::from(vec![1_u64]), v);
1372 let v: BorrowedValue = json_typed!(borrowed, [1]);
1373 assert_eq!(BorrowedValue::from(vec![1_u64]), v);
1374 let v: BorrowedValue = json_typed!(borrowed, []);
1375 assert_eq!(BorrowedValue::array(), v);
1376 }
1377 #[cfg(feature = "serde_impl")]
1378 #[test]
1379 fn obj_typed_owned() {
1380 use halfbrown::hashmap;
1381 let v: OwnedValue = json_typed!(owned, hashmap! {"test" => 1});
1382 let o = owned_test_map();
1383 assert_eq!(o, v);
1384 let v: OwnedValue = json_typed!(owned, {"test": 1});
1385 assert_eq!(o, v);
1386 let v: OwnedValue = json_typed!(owned, {});
1387 assert_eq!(OwnedValue::object(), v);
1388 }
1389
1390 #[cfg(feature = "serde_impl")]
1391 #[test]
1392 fn obj_typed_borrowed() {
1393 use halfbrown::hashmap;
1394 let v: BorrowedValue = json_typed!(borrowed, hashmap! {"test" => 1});
1395 let o = borrowed_test_map();
1396 assert_eq!(o, v);
1397 let v: BorrowedValue = json_typed!(borrowed, {"test": 1});
1398 assert_eq!(o, v);
1399 let v: BorrowedValue = json_typed!(borrowed, {});
1400 assert_eq!(BorrowedValue::object(), v);
1401 }
1402}