sppparse/
sparse_pointed_value.rs

1use super::*;
2
3/// # A raw selector between a raw object, a raw pointer or an owned pointer
4///
5/// The [SparsePointedValue](SparsePointedValue) allows to switch between a raw, unparsed pointer
6/// to a parsed pointer resolved at initialization.
7#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
8#[serde(untagged)]
9pub enum SparsePointedValue<S> {
10    RefRaw(Box<SparseRefRaw<S>>),
11    Obj(S),
12    Ref(SparseRef<S>),
13    Null,
14}
15
16impl<S> SparsableTrait for SparsePointedValue<S>
17where
18    S: DeserializeOwned + Serialize + SparsableTrait,
19{
20    fn sparse_init(
21        &mut self,
22        state: &mut SparseState,
23        metadata: &SparseMetadata,
24        depth: u32,
25    ) -> Result<(), SparseError> {
26        self.check_depth(depth)?;
27        match self {
28            SparsePointedValue::Null => self.self_reset(state, metadata, depth)?,
29            _ => {
30                if let Some(SparseError::OutdatedPointer) = self.check_version(state).err() {
31                    self.self_reset(state, metadata, depth)?;
32                }
33            }
34        }
35        match self {
36            SparsePointedValue::RefRaw(x) => x.sparse_init(state, metadata, depth + 1),
37            SparsePointedValue::Obj(x) => x.sparse_init(state, metadata, depth + 1),
38            SparsePointedValue::Ref(x) => x.sparse_init(state, metadata, depth + 1),
39            SparsePointedValue::Null => Err(SparseError::BadPointer),
40        }
41    }
42
43    fn sparse_updt<'a>(
44        &mut self,
45        state: &mut SparseState,
46        metadata: &SparseMetadata,
47        depth: u32,
48    ) -> Result<(), SparseError> {
49        self.check_depth(depth)?;
50        let vcheck = self.check_version(state);
51        match vcheck {
52            Ok(()) => (),
53            Err(SparseError::OutdatedPointer) => self.sparse_init(state, metadata, depth + 1)?,
54            Err(_) => return vcheck,
55        };
56        match self {
57            SparsePointedValue::RefRaw(x) => x.sparse_updt(state, metadata, depth + 1),
58            SparsePointedValue::Obj(x) => x.sparse_updt(state, metadata, depth + 1),
59            SparsePointedValue::Ref(x) => x.sparse_updt(state, metadata, depth + 1),
60            SparsePointedValue::Null => Err(SparseError::BadPointer),
61        }
62    }
63}
64
65impl<S> std::default::Default for SparsePointedValue<S> {
66    fn default() -> Self {
67        SparsePointedValue::Null
68    }
69}
70
71impl<S> SparsePointedValue<S> {
72    pub fn default_boxed() -> Box<Self> {
73        Box::new(SparsePointedValue::<S>::default())
74    }
75}
76
77impl<S> SparsePointerRaw<S> for SparsePointedValue<S>
78where
79    S: DeserializeOwned + Serialize + SparsableTrait,
80{
81    fn check_version<'a>(&'a self, state: &'a SparseState) -> Result<(), SparseError> {
82        match self {
83            SparsePointedValue::RefRaw(x) => Ok(x.check_version(state)?),
84            SparsePointedValue::Ref(x) => Ok(x.check_version(state)?),
85            SparsePointedValue::Obj(_x) => Ok(()),
86            SparsePointedValue::Null => Err(SparseError::BadPointer),
87        }
88    }
89
90    fn get<'a>(
91        &'a self,
92        metadata: Option<&'a SparseMetadata>,
93    ) -> Result<SparseValue<'a, S>, SparseError> {
94        match self {
95            SparsePointedValue::Ref(x) => Ok(x.get()?),
96            SparsePointedValue::Obj(x) => Ok(SparseValue::new(x, metadata)),
97            SparsePointedValue::RefRaw(x) => Ok(x.get(metadata)?),
98            SparsePointedValue::Null => Err(SparseError::BadPointer),
99        }
100    }
101
102    fn get_mut<'a>(
103        &'a mut self,
104        state_cell: Rc<RefCell<SparseState>>,
105        metadata: Option<&'a SparseMetadata>,
106    ) -> Result<SparseValueMut<'a, S>, SparseError> {
107        {
108            let state = state_cell
109                .try_borrow()
110                .map_err(|_e| SparseError::StateAlreadyBorrowed)?;
111            self.check_version(&state)?;
112        }
113        match self {
114            SparsePointedValue::Ref(x) => Ok(x.get_mut(state_cell)?),
115            SparsePointedValue::Obj(x) => Ok(SparseValueMut::new(&mut *x, state_cell, metadata)),
116            SparsePointedValue::RefRaw(x) => Ok(x.get_mut(state_cell, metadata)?),
117            SparsePointedValue::Null => Err(SparseError::BadPointer),
118        }
119    }
120
121    fn self_reset<'a>(
122        &mut self,
123        state: &mut SparseState,
124        metadata: &'a SparseMetadata,
125        depth: u32,
126    ) -> Result<(), SparseError> {
127        self.check_depth(depth)?;
128        match self {
129            SparsePointedValue::Ref(x) => Ok(x.self_reset(state, metadata, depth + 1)?),
130            SparsePointedValue::Obj(_x) => Ok(()),
131            SparsePointedValue::RefRaw(x) => Ok(x.self_reset(state, metadata, depth + 1)?),
132            SparsePointedValue::Null => Ok(()),
133        }
134    }
135}