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_2021,)*]) => {
227 json_internal_vec![$($elems,)*]
228 };
229
230 (@array [$($elems:expr_2021),*]) => {
232 json_internal_vec![$($elems),*]
233 };
234
235 (@array [$($elems:expr_2021,)*] null $($rest:tt)*) => {
237 json_internal_owned!(@array [$($elems,)* json_internal_owned!(null)] $($rest)*)
238 };
239
240 (@array [$($elems:expr_2021,)*] true $($rest:tt)*) => {
242 json_internal_owned!(@array [$($elems,)* json_internal_owned!(true)] $($rest)*)
243 };
244
245 (@array [$($elems:expr_2021,)*] false $($rest:tt)*) => {
247 json_internal_owned!(@array [$($elems,)* json_internal_owned!(false)] $($rest)*)
248 };
249
250 (@array [$($elems:expr_2021,)*] [$($array:tt)*] $($rest:tt)*) => {
252 json_internal_owned!(@array [$($elems,)* json_internal_owned!([$($array)*])] $($rest)*)
253 };
254
255 (@array [$($elems:expr_2021,)*] {$($map:tt)*} $($rest:tt)*) => {
257 json_internal_owned!(@array [$($elems,)* json_internal_owned!({$($map)*})] $($rest)*)
258 };
259
260 (@array [$($elems:expr_2021,)*] $next:expr_2021, $($rest:tt)*) => {
262 json_internal_owned!(@array [$($elems,)* json_internal_owned!($next),] $($rest)*)
263 };
264
265 (@array [$($elems:expr_2021,)*] $last:expr_2021) => {
267 json_internal_owned!(@array [$($elems,)* json_internal_owned!($last)])
268 };
269
270 (@array [$($elems:expr_2021),*] , $($rest:tt)*) => {
272 json_internal_owned!(@array [$($elems,)*] $($rest)*)
273 };
274
275 (@array [$($elems:expr_2021),*] $unexpected:tt $($rest:tt)*) => {
277 json_unexpected!($unexpected)
278 };
279
280 (@object $object:ident [@entries] () () ()) => {};
294
295 (@object @count [@entries $(($value:expr_2021 => $($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_2021 => $($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(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_2021) , $($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_2021)) => {
324 json_internal_owned!(@object $object [@entries $($entries)* ($value => $($key)+) ] () () ());
325 };
326
327 (@object $object:ident [@entries $($entries:tt)*] [$($key:tt)+] ($value:expr_2021) $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_2021 , $($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_2021) $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_2021) : $($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_2021) => {
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_2021,)*]) => {
710 json_internal_vec![$($elems,)*]
711 };
712
713 (@array [$($elems:expr_2021),*]) => {
715 json_internal_vec![$($elems),*]
716 };
717
718 (@array [$($elems:expr_2021,)*] null $($rest:tt)*) => {
720 json_internal_borrowed!(@array [$($elems,)* json_internal_borrowed!(null)] $($rest)*)
721 };
722
723 (@array [$($elems:expr_2021,)*] true $($rest:tt)*) => {
725 json_internal_borrowed!(@array [$($elems,)* json_internal_borrowed!(true)] $($rest)*)
726 };
727
728 (@array [$($elems:expr_2021,)*] false $($rest:tt)*) => {
730 json_internal_borrowed!(@array [$($elems,)* json_internal_borrowed!(false)] $($rest)*)
731 };
732
733 (@array [$($elems:expr_2021,)*] [$($array:tt)*] $($rest:tt)*) => {
735 json_internal_borrowed!(@array [$($elems,)* json_internal_borrowed!([$($array)*])] $($rest)*)
736 };
737
738 (@array [$($elems:expr_2021,)*] {$($map:tt)*} $($rest:tt)*) => {
740 json_internal_borrowed!(@array [$($elems,)* json_internal_borrowed!({$($map)*})] $($rest)*)
741 };
742
743 (@array [$($elems:expr_2021,)*] $next:expr_2021, $($rest:tt)*) => {
745 json_internal_borrowed!(@array [$($elems,)* json_internal_borrowed!($next),] $($rest)*)
746 };
747
748 (@array [$($elems:expr_2021,)*] $last:expr_2021) => {
750 json_internal_borrowed!(@array [$($elems,)* json_internal_borrowed!($last)])
751 };
752
753 (@array [$($elems:expr_2021),*] , $($rest:tt)*) => {
755 json_internal_borrowed!(@array [$($elems,)*] $($rest)*)
756 };
757
758 (@array [$($elems:expr_2021),*] $unexpected:tt $($rest:tt)*) => {
760 json_unexpected!($unexpected)
761 };
762
763 (@object $object:ident [@entries] () () ()) => {};
777
778 (@object @count [@entries $(($value:expr_2021 => $($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_2021 => $($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(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_2021) , $($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_2021)) => {
809 json_internal_borrowed!(@object $object [@entries $($entries)* ($value => $($key)+) ] () () ());
810 };
811
812 (@object $object:ident [@entries $($entries:tt)*] [$($key:tt)+] ($value:expr_2021) $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_2021 , $($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_2021) $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_2021) : $($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_2021) => {
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")]
1196macro_rules! unlikely {
1197 ($e:expr) => {{ ::std::intrinsics::unlikely($e) }};
1198}
1199
1200#[cfg(not(feature = "hints"))]
1204macro_rules! unlikely {
1205 ($e:expr_2021) => {{
1206 #[inline]
1207 #[cold]
1208 fn cold() {}
1209
1210 let cond = $e;
1211
1212 if cond {
1213 cold();
1214 }
1215
1216 cond
1217 }};
1218}
1219
1220pub(crate) use unlikely;
1221
1222#[allow(unused_macros)]
1224macro_rules! static_cast_i32 {
1225 ($v:expr_2021) => {
1226 ::std::mem::transmute::<u32, i32>($v)
1227 };
1228}
1229#[allow(unused_imports)]
1230pub(crate) use static_cast_i32;
1231
1232#[allow(unused_macros)]
1234macro_rules! static_cast_u32 {
1235 ($v:expr_2021) => {
1236 ::std::mem::transmute::<i32, u32>($v)
1238 };
1239}
1240#[allow(unused_imports)]
1241pub(crate) use static_cast_u32;
1242
1243macro_rules! static_cast_i64 {
1245 ($v:expr_2021) => {
1246 ::std::mem::transmute::<u64, i64>($v)
1247 };
1248}
1249pub(crate) use static_cast_i64;
1250
1251#[cfg(all(feature = "approx-number-parsing", feature = "i128"))]
1253macro_rules! static_cast_i128 {
1254 ($v:expr_2021) => {
1255 ::std::mem::transmute::<_, i128>($v)
1256 };
1257}
1258#[cfg(all(feature = "approx-number-parsing", feature = "i128"))]
1259pub(crate) use static_cast_i128;
1260
1261macro_rules! static_cast_u64 {
1263 ($v:expr_2021) => {
1264 ::std::mem::transmute::<i64, u64>($v)
1265 };
1266}
1267pub(crate) use static_cast_u64;
1268
1269macro_rules! stry {
1275 ($e:expr_2021) => {
1276 match $e {
1277 ::std::result::Result::Ok(val) => val,
1278 ::std::result::Result::Err(err) => return ::std::result::Result::Err(err),
1279 }
1280 };
1281}
1282#[allow(unused_imports)]
1283pub(crate) use stry;
1284
1285#[cfg(test)]
1286mod test {
1287 use crate::prelude::*;
1288 use crate::{BorrowedValue, OwnedValue};
1289
1290 #[cfg(feature = "serde_impl")]
1291 fn owned_test_map() -> OwnedValue {
1292 let mut h = crate::owned::Object::with_hasher(crate::ObjectHasher::default());
1293 h.insert("test".into(), 1.into());
1294 OwnedValue::from(h)
1295 }
1296 #[cfg(feature = "serde_impl")]
1297 fn borrowed_test_map() -> BorrowedValue<'static> {
1298 let mut h = crate::borrowed::Object::with_hasher(crate::ObjectHasher::default());
1299 h.insert("test".into(), 1.into());
1300 BorrowedValue::from(h)
1301 }
1302
1303 #[test]
1304 fn array() {
1305 let v: OwnedValue = json!(vec![1]);
1306 assert_eq!(OwnedValue::from(vec![1_u64]), v);
1307 let v: OwnedValue = json!([1]);
1308 assert_eq!(BorrowedValue::from(vec![1_u64]), v);
1309 let v: OwnedValue = json!([]);
1310 assert_eq!(OwnedValue::array(), v);
1311 }
1312
1313 #[cfg(feature = "serde_impl")]
1314 #[test]
1315 fn obj() {
1316 use halfbrown::hashmap;
1317 let o = owned_test_map();
1318 let v: OwnedValue = json!(hashmap! {"test" => 1});
1319 assert_eq!(o, v);
1320 let v: OwnedValue = json!({"test": 1});
1321 assert_eq!(o, v);
1322 let v: OwnedValue = json!({});
1323 assert_eq!(OwnedValue::object(), v);
1324 }
1325
1326 #[test]
1327 fn array_typed_owned() {
1328 let v: OwnedValue = json_typed!(owned, vec![1]);
1329 assert_eq!(OwnedValue::from(vec![1_u64]), v);
1330 let v: OwnedValue = json_typed!(owned, [1]);
1331 assert_eq!(OwnedValue::from(vec![1_u64]), v);
1332 let v: OwnedValue = json_typed!(owned, []);
1333 assert_eq!(OwnedValue::array(), v);
1334 }
1335
1336 #[test]
1337 fn array_typed_borrowed() {
1338 let v: BorrowedValue = json_typed!(borrowed, vec![1]);
1339 assert_eq!(BorrowedValue::from(vec![1_u64]), v);
1340 let v: BorrowedValue = json_typed!(borrowed, [1]);
1341 assert_eq!(BorrowedValue::from(vec![1_u64]), v);
1342 let v: BorrowedValue = json_typed!(borrowed, []);
1343 assert_eq!(BorrowedValue::array(), v);
1344 }
1345 #[cfg(feature = "serde_impl")]
1346 #[test]
1347 fn obj_typed_owned() {
1348 use halfbrown::hashmap;
1349 let v: OwnedValue = json_typed!(owned, hashmap! {"test" => 1});
1350 let o = owned_test_map();
1351 assert_eq!(o, v);
1352 let v: OwnedValue = json_typed!(owned, {"test": 1});
1353 assert_eq!(o, v);
1354 let v: OwnedValue = json_typed!(owned, {});
1355 assert_eq!(OwnedValue::object(), v);
1356 }
1357
1358 #[cfg(feature = "serde_impl")]
1359 #[test]
1360 fn obj_typed_borrowed() {
1361 use halfbrown::hashmap;
1362 let v: BorrowedValue = json_typed!(borrowed, hashmap! {"test" => 1});
1363 let o = borrowed_test_map();
1364 assert_eq!(o, v);
1365 let v: BorrowedValue = json_typed!(borrowed, {"test": 1});
1366 assert_eq!(o, v);
1367 let v: BorrowedValue = json_typed!(borrowed, {});
1368 assert_eq!(BorrowedValue::object(), v);
1369 }
1370}