sppparse/
sparse_selector.rs

1use super::*;
2use serde::{Deserialize, Serialize};
3use std::any::Any;
4
5/// # An owned selector between a raw object, a raw pointer or an owned pointer
6///
7/// Use this enum in your structure when allowing either a pointer or the value directly.
8///
9/// The [SparseSelector](SparseSelector) allows to switch between a raw, unparsed pointer
10/// to a parsed pointer resolved at initialization.
11#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
12#[serde(untagged)]
13pub enum SparseSelector<T> {
14    /// A deserialized JSON pointer contained the pointed value from the local
15    /// or distant file
16    Ref(SparseRefRaw<T>),
17    /// The object included in the original document
18    Obj(SparsePointedValue<T>),
19    /// A default value that should not be present once the
20    /// [SparseRoot](crate::SparseRoot) document has been initialized.
21    Null,
22}
23
24impl<T> SparsableTrait for SparseSelector<T>
25where
26    T: Any + DeserializeOwned + Serialize + SparsableTrait,
27{
28    fn sparse_init<'a>(
29        &mut self,
30        state: &mut SparseState,
31        metadata: &SparseMetadata,
32        depth: u32,
33    ) -> Result<(), SparseError> {
34        self.check_depth(depth)?;
35        self.self_reset(state, metadata, depth)?;
36        self.check_version(state)?;
37        match self {
38            SparseSelector::Ref(x) => Ok(x.sparse_init(state, metadata, depth + 1)?),
39            SparseSelector::Obj(x) => Ok(x.sparse_init(state, metadata, depth + 1)?),
40            SparseSelector::Null => Err(SparseError::BadPointer),
41        }
42    }
43
44    fn sparse_updt<'a>(
45        &mut self,
46        state: &mut SparseState,
47        metadata: &SparseMetadata,
48        depth: u32,
49    ) -> Result<(), SparseError> {
50        self.check_depth(depth)?;
51        let vcheck = self.check_version(state);
52        match vcheck {
53            Ok(()) => (),
54            Err(SparseError::OutdatedPointer) => self.sparse_updt(state, metadata, depth)?,
55            Err(_) => return vcheck,
56        };
57        match self {
58            SparseSelector::Ref(x) => Ok(x.sparse_init(state, metadata, depth + 1)?),
59            SparseSelector::Obj(x) => Ok(x.sparse_init(state, metadata, depth + 1)?),
60            SparseSelector::Null => Err(SparseError::BadPointer),
61        }
62    }
63}
64
65impl<T> std::default::Default for SparseSelector<T>
66where
67    T: Any + DeserializeOwned + Serialize + SparsableTrait,
68{
69    fn default() -> Self {
70        SparseSelector::Null
71    }
72}
73
74impl<T> SparsePointer<T> for SparseSelector<T>
75where
76    T: Any + DeserializeOwned + Serialize + SparsableTrait,
77{
78    fn check_version<'a>(&'a self, state: &'a SparseState) -> Result<(), SparseError> {
79        match self {
80            SparseSelector::Obj(x) => Ok(x.check_version(state)?),
81            SparseSelector::Ref(x) => Ok(x.check_version(state)?),
82            SparseSelector::Null => Err(SparseError::BadPointer),
83        }
84    }
85
86    fn get(&self) -> Result<SparseValue<'_, T>, SparseError> {
87        match self {
88            SparseSelector::Obj(x) => Ok(x.get(None)?),
89            SparseSelector::Ref(x) => Ok(x.get(None)?),
90            SparseSelector::Null => Err(SparseError::BadPointer),
91        }
92    }
93
94    fn get_mut(
95        &mut self,
96        root: Rc<RefCell<SparseState>>,
97    ) -> Result<SparseValueMut<'_, T>, SparseError> {
98        match self {
99            SparseSelector::Obj(x) => Ok(x.get_mut(root, None)?),
100            SparseSelector::Ref(x) => Ok(x.get_mut(root, None)?),
101            SparseSelector::Null => Err(SparseError::BadPointer),
102        }
103    }
104
105    fn self_reset(
106        &mut self,
107        state: &mut SparseState,
108        metadata: &SparseMetadata,
109        depth: u32,
110    ) -> Result<(), SparseError> {
111        self.check_depth(depth)?;
112        match self {
113            SparseSelector::Obj(x) => Ok(x.self_reset(state, metadata, depth)?),
114            SparseSelector::Ref(x) => Ok(x.self_reset(state, metadata, depth)?),
115            SparseSelector::Null => Err(SparseError::BadPointer),
116        }
117    }
118}