1use std::borrow::Borrow;
44use std::cell::RefCell;
45use std::fmt;
46#[cfg(feature = "deserialize")]
47use std::marker::PhantomData;
48use std::ops::Deref;
49use std::rc::{Rc, Weak as RcWeak};
50use std::sync::{Arc, Mutex, Weak as ArcWeak};
51
52#[cfg(feature = "deserialize")]
53use serde_core::de::{Error as _, Visitor};
54
55#[cfg(feature = "deserialize")]
56use crate::anchor_store;
57
58#[repr(transparent)]
81#[derive(Clone)]
82pub struct RcAnchor<T>(pub Rc<T>);
83
84#[repr(transparent)]
106#[derive(Clone)]
107pub struct ArcAnchor<T>(pub Arc<T>);
108
109#[repr(transparent)]
135#[derive(Clone)]
136pub struct RcWeakAnchor<T>(pub RcWeak<T>);
137
138#[repr(transparent)]
161#[derive(Clone)]
162pub struct ArcWeakAnchor<T>(pub ArcWeak<T>);
163
164#[repr(transparent)]
199#[derive(Clone)]
200pub struct RcRecursive<T>(pub Rc<RefCell<Option<T>>>);
201
202#[repr(transparent)]
245#[derive(Clone)]
246pub struct ArcRecursive<T>(pub Arc<Mutex<Option<T>>>);
247
248#[repr(transparent)]
251#[derive(Clone)]
252pub struct RcRecursion<T>(pub RcWeak<RefCell<Option<T>>>);
253
254#[repr(transparent)]
258#[derive(Clone)]
259pub struct ArcRecursion<T>(pub ArcWeak<Mutex<Option<T>>>);
260
261impl<T> From<Rc<T>> for RcAnchor<T> {
264 fn from(rc: Rc<T>) -> Self {
265 RcAnchor(rc)
266 }
267}
268
269impl<T> RcAnchor<T> {
270 pub fn wrapping(x: T) -> Self {
272 RcAnchor(Rc::new(x))
273 }
274}
275
276impl<T> ArcAnchor<T> {
277 pub fn wrapping(x: T) -> Self {
279 ArcAnchor(Arc::new(x))
280 }
281}
282
283impl<T> From<Arc<T>> for ArcAnchor<T> {
284 #[inline]
285 fn from(arc: Arc<T>) -> Self {
286 ArcAnchor(arc)
287 }
288}
289
290impl<T> From<&Rc<T>> for RcWeakAnchor<T> {
293 #[inline]
294 fn from(rc: &Rc<T>) -> Self {
295 RcWeakAnchor(Rc::downgrade(rc))
296 }
297}
298impl<T> From<Rc<T>> for RcWeakAnchor<T> {
299 #[inline]
300 fn from(rc: Rc<T>) -> Self {
301 RcWeakAnchor(Rc::downgrade(&rc))
302 }
303}
304impl<T> From<&RcAnchor<T>> for RcWeakAnchor<T> {
305 #[inline]
306 fn from(rca: &RcAnchor<T>) -> Self {
307 RcWeakAnchor(Rc::downgrade(&rca.0))
308 }
309}
310impl<T> From<&Arc<T>> for ArcWeakAnchor<T> {
311 #[inline]
312 fn from(arc: &Arc<T>) -> Self {
313 ArcWeakAnchor(Arc::downgrade(arc))
314 }
315}
316impl<T> From<Arc<T>> for ArcWeakAnchor<T> {
317 #[inline]
318 fn from(arc: Arc<T>) -> Self {
319 ArcWeakAnchor(Arc::downgrade(&arc))
320 }
321}
322impl<T> From<&ArcAnchor<T>> for ArcWeakAnchor<T> {
323 #[inline]
324 fn from(ara: &ArcAnchor<T>) -> Self {
325 ArcWeakAnchor(Arc::downgrade(&ara.0))
326 }
327}
328
329impl<T> From<&RcRecursive<T>> for RcRecursion<T> {
332 #[inline]
333 fn from(rca: &RcRecursive<T>) -> Self {
334 RcRecursion(Rc::downgrade(&rca.0))
335 }
336}
337
338impl<T> From<&ArcRecursive<T>> for ArcRecursion<T> {
339 #[inline]
340 fn from(ara: &ArcRecursive<T>) -> Self {
341 ArcRecursion(Arc::downgrade(&ara.0))
342 }
343}
344
345impl<T> Deref for RcAnchor<T> {
348 type Target = Rc<T>;
349 #[inline]
350 fn deref(&self) -> &Self::Target {
351 &self.0
352 }
353}
354impl<T> Deref for ArcAnchor<T> {
355 type Target = Arc<T>;
356 #[inline]
357 fn deref(&self) -> &Self::Target {
358 &self.0
359 }
360}
361impl<T> Deref for RcRecursive<T> {
362 type Target = Rc<RefCell<Option<T>>>;
363 #[inline]
364 fn deref(&self) -> &Self::Target {
365 &self.0
366 }
367}
368impl<T> Deref for ArcRecursive<T> {
369 type Target = Arc<Mutex<Option<T>>>;
370 #[inline]
371 fn deref(&self) -> &Self::Target {
372 &self.0
373 }
374}
375impl<T> AsRef<Rc<T>> for RcAnchor<T> {
376 #[inline]
377 fn as_ref(&self) -> &Rc<T> {
378 &self.0
379 }
380}
381impl<T> AsRef<Arc<T>> for ArcAnchor<T> {
382 #[inline]
383 fn as_ref(&self) -> &Arc<T> {
384 &self.0
385 }
386}
387impl<T> Borrow<Rc<T>> for RcAnchor<T> {
388 #[inline]
389 fn borrow(&self) -> &Rc<T> {
390 &self.0
391 }
392}
393impl<T> Borrow<Arc<T>> for ArcAnchor<T> {
394 #[inline]
395 fn borrow(&self) -> &Arc<T> {
396 &self.0
397 }
398}
399impl<T> From<RcAnchor<T>> for Rc<T> {
400 #[inline]
401 fn from(a: RcAnchor<T>) -> Rc<T> {
402 a.0
403 }
404}
405impl<T> From<ArcAnchor<T>> for Arc<T> {
406 #[inline]
407 fn from(a: ArcAnchor<T>) -> Arc<T> {
408 a.0
409 }
410}
411
412impl<T> RcRecursive<T> {
413 pub fn wrapping(x: T) -> Self {
415 RcRecursive(Rc::new(RefCell::new(Some(x))))
416 }
417
418 pub fn try_borrow_initialized(&self) -> Option<std::cell::Ref<'_, T>> {
422 let borrowed = self.0.as_ref().try_borrow().ok()?;
423 std::cell::Ref::filter_map(borrowed, Option::as_ref).ok()
424 }
425
426 pub fn borrow(&self) -> std::cell::Ref<'_, T> {
433 let borrowed = self.0.as_ref().borrow();
434 std::cell::Ref::filter_map(borrowed, Option::as_ref)
435 .ok()
436 .expect("recursive Rc anchor not initialized")
437 }
438}
439
440impl<T> ArcRecursive<T> {
441 pub fn wrapping(x: T) -> Self {
443 ArcRecursive(Arc::new(Mutex::new(Some(x))))
444 }
445
446 pub fn lock(&self) -> std::sync::LockResult<std::sync::MutexGuard<'_, Option<T>>> {
448 self.0.lock()
449 }
450}
451
452impl<T> RcWeakAnchor<T> {
455 #[inline]
458 pub fn upgrade(&self) -> Option<Rc<T>> {
459 self.0.upgrade()
460 }
461
462 #[inline]
464 pub fn is_dangling(&self) -> bool {
465 self.0.strong_count() == 0
466 }
467}
468impl<T> RcRecursion<T> {
469 #[inline]
471 pub fn upgrade(&self) -> Option<RcRecursive<T>> {
472 self.0.upgrade().map(RcRecursive)
473 }
474
475 #[inline]
477 pub fn with<R>(&self, f: impl FnOnce(&T) -> R) -> Option<R> {
478 let upgraded = self.upgrade()?;
479 let borrowed = upgraded.try_borrow_initialized()?;
480 Some(f(&borrowed))
481 }
482
483 #[inline]
485 pub fn is_dangling(&self) -> bool {
486 self.0.strong_count() == 0
487 }
488}
489impl<T> ArcRecursion<T> {
490 #[inline]
492 pub fn upgrade(&self) -> Option<ArcRecursive<T>> {
493 self.0.upgrade().map(ArcRecursive)
494 }
495
496 #[inline]
498 pub fn with<R>(&self, f: impl FnOnce(&T) -> R) -> Option<R> {
499 let upgraded = self.upgrade()?;
500 let guard = upgraded.lock().ok()?;
501 let value = guard.as_ref()?;
502 Some(f(value))
503 }
504
505 #[inline]
507 pub fn is_dangling(&self) -> bool {
508 self.0.strong_count() == 0
509 }
510}
511impl<T> ArcWeakAnchor<T> {
512 #[inline]
515 pub fn upgrade(&self) -> Option<Arc<T>> {
516 self.0.upgrade()
517 }
518
519 #[inline]
521 pub fn is_dangling(&self) -> bool {
522 self.0.strong_count() == 0
523 }
524}
525
526impl<T> PartialEq for RcAnchor<T> {
529 #[inline]
530 fn eq(&self, other: &Self) -> bool {
531 Rc::ptr_eq(&self.0, &other.0)
532 }
533}
534impl<T> Eq for RcAnchor<T> {}
535
536impl<T> PartialEq for ArcAnchor<T> {
537 #[inline]
538 fn eq(&self, other: &Self) -> bool {
539 Arc::ptr_eq(&self.0, &other.0)
540 }
541}
542impl<T> Eq for ArcAnchor<T> {}
543
544impl<T> PartialEq for RcWeakAnchor<T> {
545 #[inline]
546 fn eq(&self, other: &Self) -> bool {
547 self.0.ptr_eq(&other.0)
548 }
549}
550impl<T> Eq for RcWeakAnchor<T> {}
551
552impl<T> PartialEq for RcRecursion<T> {
553 #[inline]
554 fn eq(&self, other: &Self) -> bool {
555 self.0.ptr_eq(&other.0)
556 }
557}
558impl<T> Eq for RcRecursion<T> {}
559
560impl<T> PartialEq for ArcWeakAnchor<T> {
561 #[inline]
562 fn eq(&self, other: &Self) -> bool {
563 self.0.ptr_eq(&other.0)
564 }
565}
566impl<T> PartialEq for RcRecursive<T> {
567 #[inline]
568 fn eq(&self, other: &Self) -> bool {
569 Rc::ptr_eq(&self.0, &other.0)
570 }
571}
572impl<T> Eq for RcRecursive<T> {}
573
574impl<T> PartialEq for ArcRecursion<T> {
575 #[inline]
576 fn eq(&self, other: &Self) -> bool {
577 self.0.ptr_eq(&other.0)
578 }
579}
580impl<T> Eq for ArcRecursion<T> {}
581
582impl<T> PartialEq for ArcRecursive<T> {
583 #[inline]
584 fn eq(&self, other: &Self) -> bool {
585 Arc::ptr_eq(&self.0, &other.0)
586 }
587}
588impl<T> Eq for ArcRecursive<T> {}
589impl<T> Eq for ArcWeakAnchor<T> {}
590
591impl<T> fmt::Debug for RcAnchor<T> {
594 #[inline]
595 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
596 write!(f, "RcAnchor({:p})", Rc::as_ptr(&self.0))
597 }
598}
599impl<T> fmt::Debug for ArcAnchor<T> {
600 #[inline]
601 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
602 write!(f, "ArcAnchor({:p})", Arc::as_ptr(&self.0))
603 }
604}
605impl<T> fmt::Debug for RcWeakAnchor<T> {
606 #[inline]
607 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
608 if let Some(rc) = self.0.upgrade() {
609 write!(f, "RcWeakAnchor(upgrade={:p})", Rc::as_ptr(&rc))
610 } else {
611 write!(f, "RcWeakAnchor(dangling)")
612 }
613 }
614}
615impl<T> fmt::Debug for ArcWeakAnchor<T> {
616 #[inline]
617 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
618 if let Some(arc) = self.0.upgrade() {
619 write!(f, "ArcWeakAnchor(upgrade={:p})", Arc::as_ptr(&arc))
620 } else {
621 write!(f, "ArcWeakAnchor(dangling)")
622 }
623 }
624}
625impl<T> fmt::Debug for RcRecursive<T> {
626 #[inline]
627 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
628 write!(f, "RcRecursive({:p})", Rc::as_ptr(&self.0))
629 }
630}
631impl<T> fmt::Debug for ArcRecursive<T> {
632 #[inline]
633 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
634 write!(f, "ArcRecursive({:p})", Arc::as_ptr(&self.0))
635 }
636}
637impl<T> fmt::Debug for RcRecursion<T> {
638 #[inline]
639 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
640 if let Some(rc) = self.0.upgrade() {
641 write!(f, "RcRecursion(upgrade={:p})", Rc::as_ptr(&rc))
642 } else {
643 write!(f, "RcRecursion(dangling)")
644 }
645 }
646}
647impl<T> fmt::Debug for ArcRecursion<T> {
648 #[inline]
649 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
650 if let Some(arc) = self.0.upgrade() {
651 write!(f, "ArcRecursion(upgrade={:p})", Arc::as_ptr(&arc))
652 } else {
653 write!(f, "ArcRecursion(dangling)")
654 }
655 }
656}
657
658impl<T: Default> Default for RcAnchor<T> {
661 #[inline]
662 fn default() -> Self {
663 RcAnchor(Rc::new(T::default()))
664 }
665}
666impl<T: Default> Default for ArcAnchor<T> {
667 fn default() -> Self {
668 ArcAnchor(Arc::new(T::default()))
669 }
670}
671impl<T: Default> Default for RcRecursive<T> {
672 #[inline]
673 fn default() -> Self {
674 RcRecursive(Rc::new(RefCell::new(Some(T::default()))))
675 }
676}
677impl<T: Default> Default for ArcRecursive<T> {
678 fn default() -> Self {
679 ArcRecursive(Arc::new(Mutex::new(Some(T::default()))))
680 }
681}
682
683#[cfg(feature = "deserialize")]
687impl<'de, T> serde_core::de::Deserialize<'de> for RcAnchor<T>
688where
689 T: serde_core::de::Deserialize<'de> + 'static,
690{
691 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
692 where
693 D: serde_core::de::Deserializer<'de>,
694 {
695 struct RcAnchorVisitor<T>(PhantomData<T>);
696
697 impl<'de, T> Visitor<'de> for RcAnchorVisitor<T>
698 where
699 T: serde_core::de::Deserialize<'de> + 'static,
700 {
701 type Value = RcAnchor<T>;
702
703 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
704 f.write_str("an RcAnchor newtype")
705 }
706
707 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
708 where
709 D: serde_core::de::Deserializer<'de>,
710 {
711 let anchor_id = anchor_store::claim_rc_anchor();
712 let existing = match anchor_id {
713 Some(id) => {
714 Some((id, anchor_store::get_rc::<T>(id).map_err(D::Error::custom)?))
715 }
716 None => None,
717 };
718 if let Some((id, None)) = existing
719 && anchor_store::rc_anchor_reentrant(id)
720 {
721 return Err(D::Error::custom(
722 "Recursive references require weak anchors",
723 ));
724 }
725
726 let value = T::deserialize(deserializer)?;
727 if let Some((_, Some(rc))) = existing {
728 drop(value);
729 return Ok(RcAnchor(rc));
730 }
731 if let Some((id, None)) = existing {
732 let rc = Rc::new(value);
733 anchor_store::store_rc(id, rc.clone());
734 return Ok(RcAnchor(rc));
735 }
736 Ok(RcAnchor(Rc::new(value)))
737 }
738 }
739
740 deserializer.deserialize_newtype_struct("__yaml_rc_anchor", RcAnchorVisitor(PhantomData))
741 }
742}
743
744#[cfg(feature = "deserialize")]
745impl<'de, T> serde_core::de::Deserialize<'de> for ArcAnchor<T>
746where
747 T: serde_core::de::Deserialize<'de> + Send + Sync + 'static,
748{
749 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
750 where
751 D: serde_core::de::Deserializer<'de>,
752 {
753 struct ArcAnchorVisitor<T>(PhantomData<T>);
754
755 impl<'de, T> Visitor<'de> for ArcAnchorVisitor<T>
756 where
757 T: serde_core::de::Deserialize<'de> + Send + Sync + 'static,
758 {
759 type Value = ArcAnchor<T>;
760
761 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
762 f.write_str("an ArcAnchor newtype")
763 }
764
765 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
766 where
767 D: serde_core::de::Deserializer<'de>,
768 {
769 let anchor_id = anchor_store::claim_arc_anchor();
770 let existing = match anchor_id {
771 Some(id) => Some((
772 id,
773 anchor_store::get_arc::<T>(id).map_err(D::Error::custom)?,
774 )),
775 None => None,
776 };
777 if let Some((id, None)) = existing
778 && anchor_store::arc_anchor_reentrant(id)
779 {
780 return Err(D::Error::custom(
781 "Recursive references require weak anchors",
782 ));
783 }
784
785 let value = T::deserialize(deserializer)?;
786 if let Some((_, Some(arc))) = existing {
787 drop(value);
788 return Ok(ArcAnchor(arc));
789 }
790 if let Some((id, None)) = existing {
791 let arc = Arc::new(value);
792 anchor_store::store_arc(id, arc.clone());
793 return Ok(ArcAnchor(arc));
794 }
795 Ok(ArcAnchor(Arc::new(value)))
796 }
797 }
798
799 deserializer.deserialize_newtype_struct("__yaml_arc_anchor", ArcAnchorVisitor(PhantomData))
800 }
801}
802
803#[cfg(feature = "deserialize")]
804impl<'de, T> serde_core::de::Deserialize<'de> for RcRecursive<T>
805where
806 T: serde_core::de::Deserialize<'de> + 'static,
807{
808 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
809 where
810 D: serde_core::de::Deserializer<'de>,
811 {
812 struct RcRecursiveVisitor<T>(PhantomData<T>);
813
814 impl<'de, T> Visitor<'de> for RcRecursiveVisitor<T>
815 where
816 T: serde_core::de::Deserialize<'de> + 'static,
817 {
818 type Value = RcRecursive<T>;
819
820 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
821 f.write_str("an RcRecursive newtype")
822 }
823
824 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
825 where
826 D: serde_core::de::Deserializer<'de>,
827 {
828 let anchor_id = anchor_store::claim_rc_recursive_anchor();
829 let existing = match anchor_id {
830 Some(id) => Some((
831 id,
832 anchor_store::get_rc_recursive::<RefCell<Option<T>>>(id)
833 .map_err(D::Error::custom)?,
834 )),
835 None => None,
836 };
837 if let Some((id, None)) = existing
838 && anchor_store::rc_recursive_reentrant(id)
839 {
840 return Err(D::Error::custom(
841 "recursive references require weak recursion types",
842 ));
843 }
844
845 if let Some((_, Some(rc))) = existing {
846 let value = T::deserialize(deserializer)?;
847 drop(value);
848 return Ok(RcRecursive(rc));
849 }
850
851 if let Some((id, None)) = existing {
852 let rc = Rc::new(RefCell::new(None));
853 anchor_store::store_rc_recursive(id, rc.clone());
854
855 let value = T::deserialize(deserializer)?;
856 *rc.borrow_mut() = Some(value);
857 return Ok(RcRecursive(rc));
858 }
859
860 let value = T::deserialize(deserializer)?;
861 Ok(RcRecursive(Rc::new(RefCell::new(Some(value)))))
862 }
863 }
864
865 deserializer
866 .deserialize_newtype_struct("__yaml_rc_recursive", RcRecursiveVisitor(PhantomData))
867 }
868}
869
870#[cfg(feature = "deserialize")]
871impl<'de, T> serde_core::de::Deserialize<'de> for ArcRecursive<T>
872where
873 T: serde_core::de::Deserialize<'de> + Send + Sync + 'static,
874{
875 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
876 where
877 D: serde_core::de::Deserializer<'de>,
878 {
879 struct ArcRecursiveVisitor<T>(PhantomData<T>);
880
881 impl<'de, T> Visitor<'de> for ArcRecursiveVisitor<T>
882 where
883 T: serde_core::de::Deserialize<'de> + Send + Sync + 'static,
884 {
885 type Value = ArcRecursive<T>;
886
887 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
888 f.write_str("an ArcRecursive newtype")
889 }
890
891 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
892 where
893 D: serde_core::de::Deserializer<'de>,
894 {
895 let anchor_id = anchor_store::claim_arc_recursive_anchor();
896 let existing = match anchor_id {
897 Some(id) => Some((
898 id,
899 anchor_store::get_arc_recursive::<Mutex<Option<T>>>(id)
900 .map_err(D::Error::custom)?,
901 )),
902 None => None,
903 };
904 if let Some((id, None)) = existing
905 && anchor_store::arc_recursive_reentrant(id)
906 {
907 return Err(D::Error::custom(
908 "recursive references require weak recursion types",
909 ));
910 }
911
912 if let Some((_, Some(arc))) = existing {
913 let value = T::deserialize(deserializer)?;
914 drop(value);
915 return Ok(ArcRecursive(arc));
916 }
917
918 if let Some((id, None)) = existing {
919 let arc = Arc::new(Mutex::new(None));
920 anchor_store::store_arc_recursive(id, arc.clone());
921
922 let value = T::deserialize(deserializer)?;
923 *arc.lock()
924 .map_err(|_| D::Error::custom("recursive Arc anchor mutex poisoned"))? =
925 Some(value);
926 return Ok(ArcRecursive(arc));
927 }
928
929 let value = T::deserialize(deserializer)?;
930 Ok(ArcRecursive(Arc::new(Mutex::new(Some(value)))))
931 }
932 }
933
934 deserializer
935 .deserialize_newtype_struct("__yaml_arc_recursive", ArcRecursiveVisitor(PhantomData))
936 }
937}
938
939#[cfg(feature = "deserialize")]
943impl<'de, T> serde_core::de::Deserialize<'de> for RcWeakAnchor<T>
944where
945 T: serde_core::de::Deserialize<'de> + 'static,
946{
947 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
948 where
949 D: serde_core::de::Deserializer<'de>,
950 {
951 struct RcWeakVisitor<T>(PhantomData<T>);
952 impl<'de, T> Visitor<'de> for RcWeakVisitor<T>
953 where
954 T: serde_core::de::Deserialize<'de> + 'static,
955 {
956 type Value = RcWeakAnchor<T>;
957 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
958 f.write_str(
959 "an RcWeakAnchor referring to a previously defined strong anchor (via alias)",
960 )
961 }
962 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
963 where
964 D: serde_core::de::Deserializer<'de>,
965 {
966 let is_null =
968 <Option<serde_core::de::IgnoredAny> as serde_core::de::Deserialize>::deserialize(
969 deserializer,
970 )?
971 .is_none();
972 if is_null {
973 return Ok(RcWeakAnchor(RcWeak::new()));
974 }
975
976 let id = anchor_store::current_rc_anchor().ok_or_else(|| {
978 D::Error::custom(
979 "weak Rc anchor must refer to an existing strong anchor via alias",
980 )
981 })?;
982 match anchor_store::get_rc::<T>(id).map_err(D::Error::custom)? {
984 Some(rc) => Ok(RcWeakAnchor(Rc::downgrade(&rc))),
985 None if anchor_store::rc_anchor_reentrant(id) => {
986 Err(D::Error::custom("Recursive references require RcRecursion"))
987 }
988 None => Err(D::Error::custom(
989 "weak Rc anchor refers to unknown anchor; strong anchor must be defined before weak",
990 )),
991 }
992 }
993 }
994 deserializer.deserialize_newtype_struct("__yaml_rc_weak_anchor", RcWeakVisitor(PhantomData))
995 }
996}
997
998#[cfg(feature = "deserialize")]
999impl<'de, T> serde_core::de::Deserialize<'de> for ArcWeakAnchor<T>
1000where
1001 T: serde_core::de::Deserialize<'de> + Send + Sync + 'static,
1002{
1003 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1004 where
1005 D: serde_core::de::Deserializer<'de>,
1006 {
1007 struct ArcWeakVisitor<T>(PhantomData<T>);
1008 impl<'de, T> Visitor<'de> for ArcWeakVisitor<T>
1009 where
1010 T: serde_core::de::Deserialize<'de> + Send + Sync + 'static,
1011 {
1012 type Value = ArcWeakAnchor<T>;
1013 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
1014 f.write_str(
1015 "an ArcWeakAnchor referring to a previously defined strong anchor (via alias)",
1016 )
1017 }
1018 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
1019 where
1020 D: serde_core::de::Deserializer<'de>,
1021 {
1022 let is_null =
1023 <Option<serde_core::de::IgnoredAny> as serde_core::de::Deserialize>::deserialize(
1024 deserializer,
1025 )?
1026 .is_none();
1027 if is_null {
1028 return Ok(ArcWeakAnchor(ArcWeak::new()));
1029 }
1030
1031 let id = anchor_store::current_arc_anchor().ok_or_else(|| {
1032 D::Error::custom(
1033 "weak Arc anchor must refer to an existing strong anchor via alias",
1034 )
1035 })?;
1036 match anchor_store::get_arc::<T>(id).map_err(D::Error::custom)? {
1037 Some(arc) => Ok(ArcWeakAnchor(Arc::downgrade(&arc))),
1038 None if anchor_store::arc_anchor_reentrant(id) => Err(D::Error::custom(
1039 "Recursive references require ArcRecursion",
1040 )),
1041 None => Err(D::Error::custom(
1042 "weak Arc anchor refers to unknown anchor; strong anchor must be defined before weak",
1043 )),
1044 }
1045 }
1046 }
1047 deserializer
1048 .deserialize_newtype_struct("__yaml_arc_weak_anchor", ArcWeakVisitor(PhantomData))
1049 }
1050}
1051
1052#[cfg(feature = "deserialize")]
1053impl<'de, T> serde_core::de::Deserialize<'de> for RcRecursion<T>
1054where
1055 T: serde_core::de::Deserialize<'de> + 'static,
1056{
1057 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1058 where
1059 D: serde_core::de::Deserializer<'de>,
1060 {
1061 struct RcRecursionVisitor<T>(PhantomData<T>);
1062 impl<'de, T> Visitor<'de> for RcRecursionVisitor<T>
1063 where
1064 T: serde_core::de::Deserialize<'de> + 'static,
1065 {
1066 type Value = RcRecursion<T>;
1067 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
1068 f.write_str(
1069 "an RcRecursion referring to a previously defined recursive strong anchor (via alias)",
1070 )
1071 }
1072 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
1073 where
1074 D: serde_core::de::Deserializer<'de>,
1075 {
1076 let id = anchor_store::current_rc_recursive_anchor().ok_or_else(|| {
1077 D::Error::custom(
1078 "RcRecursion must refer to an existing recursive strong anchor via alias",
1079 )
1080 })?;
1081 let _ = <serde_core::de::IgnoredAny as serde_core::de::Deserialize>::deserialize(
1082 deserializer,
1083 )?;
1084 match anchor_store::get_rc_recursive::<RefCell<Option<T>>>(id)
1085 .map_err(D::Error::custom)?
1086 {
1087 Some(rc) => Ok(RcRecursion(Rc::downgrade(&rc))),
1088 None => Err(D::Error::custom(
1089 "RcRecursion refers to unknown recursive anchor id",
1090 )),
1091 }
1092 }
1093 }
1094 deserializer
1095 .deserialize_newtype_struct("__yaml_rc_recursion", RcRecursionVisitor(PhantomData))
1096 }
1097}
1098
1099#[cfg(feature = "deserialize")]
1100impl<'de, T> serde_core::de::Deserialize<'de> for ArcRecursion<T>
1101where
1102 T: serde_core::de::Deserialize<'de> + Send + Sync + 'static,
1103{
1104 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1105 where
1106 D: serde_core::de::Deserializer<'de>,
1107 {
1108 struct ArcRecursionVisitor<T>(PhantomData<T>);
1109 impl<'de, T> Visitor<'de> for ArcRecursionVisitor<T>
1110 where
1111 T: serde_core::de::Deserialize<'de> + Send + Sync + 'static,
1112 {
1113 type Value = ArcRecursion<T>;
1114 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
1115 f.write_str(
1116 "an ArcRecursion referring to a previously defined recursive strong anchor (via alias)",
1117 )
1118 }
1119 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
1120 where
1121 D: serde_core::de::Deserializer<'de>,
1122 {
1123 let id = anchor_store::current_arc_recursive_anchor().ok_or_else(|| {
1124 D::Error::custom(
1125 "ArcRecursion must refer to an existing recursive strong anchor via alias",
1126 )
1127 })?;
1128 let _ = <serde_core::de::IgnoredAny as serde_core::de::Deserialize>::deserialize(
1129 deserializer,
1130 )?;
1131 match anchor_store::get_arc_recursive::<Mutex<Option<T>>>(id)
1132 .map_err(D::Error::custom)?
1133 {
1134 Some(arc) => Ok(ArcRecursion(Arc::downgrade(&arc))),
1135 None => Err(D::Error::custom(
1136 "ArcRecursion refers to unknown recursive anchor id",
1137 )),
1138 }
1139 }
1140 }
1141 deserializer
1142 .deserialize_newtype_struct("__yaml_arc_recursion", ArcRecursionVisitor(PhantomData))
1143 }
1144}