sppparse/
sparse_selector.rs1use super::*;
2use serde::{Deserialize, Serialize};
3use std::any::Any;
4
5#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
12#[serde(untagged)]
13pub enum SparseSelector<T> {
14 Ref(SparseRefRaw<T>),
17 Obj(SparsePointedValue<T>),
19 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}