#[repr(transparent)]pub struct ArcRecursive<T>(pub Arc<Mutex<Option<T>>>);Expand description
The parent (origin) anchor definition that may have recursive references to it.
This type provides the value for the references and must be placed where the original value is defined.
Fields that reference this value (possibly recursively) must be wrapped in ArcRecursion.
use serde::Deserialize;
use serde_saphyr::{ArcRecursion, ArcRecursive};
#[derive(Deserialize)]
struct King {
name: String,
coronator: ArcRecursion<King>, // who crowned this king
}
#[derive(Deserialize)]
struct Kingdom {
king: ArcRecursive<King>,
}
let yaml = r#"
king: &root
name: "Aurelian I"
coronator: *root # this king crowned himself
"#;
let kingdom_data: Kingdom = serde_saphyr::from_str(yaml).unwrap();
let coronator = {
let king_guard = kingdom_data.king.lock().unwrap();
let king = king_guard.as_ref().expect("king should be initialized");
king.coronator
.upgrade()
.expect("coronator should be alive")
};
let coronator_guard = coronator.lock().unwrap();
let coronator_ref = coronator_guard
.as_ref()
.expect("coronator should be initialized");
assert_eq!(coronator_ref.name, "Aurelian I");Tuple Fields§
§0: Arc<Mutex<Option<T>>>Implementations§
Source§impl<T> ArcRecursive<T>
impl<T> ArcRecursive<T>
Sourcepub fn lock(&self) -> LockResult<MutexGuard<'_, Option<T>>>
pub fn lock(&self) -> LockResult<MutexGuard<'_, Option<T>>>
Lock the recursive anchor value so that it can be accessed safely.
Trait Implementations§
Source§impl<T: Clone> Clone for ArcRecursive<T>
impl<T: Clone> Clone for ArcRecursive<T>
Source§fn clone(&self) -> ArcRecursive<T>
fn clone(&self) -> ArcRecursive<T>
Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl<T> Debug for ArcRecursive<T>
impl<T> Debug for ArcRecursive<T>
Source§impl<T: Default> Default for ArcRecursive<T>
impl<T: Default> Default for ArcRecursive<T>
Source§impl<T> Deref for ArcRecursive<T>
impl<T> Deref for ArcRecursive<T>
Source§impl<'de, T> Deserialize<'de> for ArcRecursive<T>
Available on crate feature deserialize only.
impl<'de, T> Deserialize<'de> for ArcRecursive<T>
Available on crate feature
deserialize only.Source§fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>where
D: Deserializer<'de>,
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>where
D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
impl<T> Eq for ArcRecursive<T>
Source§impl<T> From<&ArcRecursive<T>> for ArcRecursion<T>
impl<T> From<&ArcRecursive<T>> for ArcRecursion<T>
Source§fn from(ara: &ArcRecursive<T>) -> Self
fn from(ara: &ArcRecursive<T>) -> Self
Converts to this type from the input type.
Source§impl<T> PartialEq for ArcRecursive<T>
impl<T> PartialEq for ArcRecursive<T>
Auto Trait Implementations§
impl<T> Freeze for ArcRecursive<T>
impl<T> RefUnwindSafe for ArcRecursive<T>
impl<T> Send for ArcRecursive<T>where
T: Send,
impl<T> Sync for ArcRecursive<T>where
T: Send,
impl<T> Unpin for ArcRecursive<T>
impl<T> UnsafeUnpin for ArcRecursive<T>
impl<T> UnwindSafe for ArcRecursive<T>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more