Skip to main content

spyne_encoding/serialization/
deserialize.rs

1use std::{borrow::Cow, collections::{BTreeMap, BTreeSet, HashMap, HashSet}, hash::Hash, marker::PhantomData};
2
3pub trait Deserializer {
4    fn read_u8(&mut self) -> Result<u8, String>;
5    fn read_u16(&mut self) -> Result<u16, String>;
6    fn read_u32(&mut self) -> Result<u32, String>;
7    fn read_u64(&mut self) -> Result<u64, String>;
8    fn read_u128(&mut self) -> Result<u128, String>;
9    fn read_i8(&mut self) -> Result<i8, String>;
10    fn read_i16(&mut self) -> Result<i16, String>;
11    fn read_i32(&mut self) -> Result<i32, String>;
12    fn read_i64(&mut self) -> Result<i64, String>;
13    fn read_i128(&mut self) -> Result<i128, String>;
14    fn read_f32(&mut self) -> Result<f32, String>;
15    fn read_f64(&mut self) -> Result<f64, String>;
16    fn read_bool(&mut self) -> Result<bool, String>;
17    fn read_bytes(&mut self) -> Result<Vec<u8>, String>;
18    fn read_string(&mut self) -> Result<String, String>;
19    fn read_seq<F, T>(&mut self, f: F) -> Result<T, String>
20    where F: FnOnce(&mut Self, usize) -> Result<T, String>;
21    fn read_map<F, T>(&mut self, f: F) -> Result<T, String>
22    where F: FnOnce(&mut Self, usize) -> Result<T, String>;
23    fn read_tuple<F, T>(&mut self, len: usize, f: F) -> Result<T, String>
24    where F: FnOnce(&mut Self) -> Result<T, String>;
25    fn read_struct<F, T>(&mut self, name: &str, fields: &[&str], f: F) -> Result<T, String>
26    where F: FnOnce(&mut Self) -> Result<T, String>;
27    fn read_enum<F, T>(&mut self, enum_name: &str, variants: &[&str], f: F) -> Result<T, String>
28    where F: FnOnce(&mut Self, u32) -> Result<T, String>;
29}
30
31pub trait Deserialize {
32    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String>
33    where Self: Sized;
34}
35
36impl Deserialize for u8 {
37    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
38        deserializer.read_u8()
39    }
40}
41impl Deserialize for u16 {
42    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
43        deserializer.read_u16()
44    }
45}
46impl Deserialize for u32 {
47    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
48        deserializer.read_u32()
49    }
50}
51impl Deserialize for u64 {
52    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
53        deserializer.read_u64()
54    }
55}
56impl Deserialize for u128 {
57    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
58        deserializer.read_u128()
59    }
60}
61impl Deserialize for usize {
62    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
63        deserializer.read_u64().map(|n| n as usize)
64    }
65}
66impl Deserialize for i8 {
67    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
68        deserializer.read_i8()
69    }
70}
71impl Deserialize for i16 {
72    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
73        deserializer.read_i16()
74    }
75}
76impl Deserialize for i32 {
77    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
78        deserializer.read_i32()
79    }
80}
81impl Deserialize for i64 {
82    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
83        deserializer.read_i64()
84    }
85}
86impl Deserialize for i128 {
87    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
88        deserializer.read_i128()
89    }
90}
91impl Deserialize for isize {
92    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
93        deserializer.read_i64().map(|n| n as isize)
94    }
95}
96impl Deserialize for f32 {
97    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
98        deserializer.read_f32()
99    }
100}
101impl Deserialize for f64 {
102    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
103        deserializer.read_f64()
104    }
105}
106impl Deserialize for bool {
107    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
108        deserializer.read_bool()
109    }
110}
111impl Deserialize for char {
112    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
113        deserializer.read_u32().and_then(|n| char::from_u32(n).ok_or_else(||format!("BinarySerde: Error during deserialization (char not a valid Unicode scalar: {})", n))) 
114    }
115}
116impl Deserialize for String {
117    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
118        deserializer.read_string()
119    }
120}
121impl<T: Deserialize> Deserialize for Vec<T> {
122    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
123        deserializer.read_seq(|dec, len| {
124            let mut vec = Vec::with_capacity(len);
125            for _ in 0..len {
126                vec.push(T::deserialize(dec)?);
127            }
128            
129            Ok(vec)
130        })
131    }
132}
133impl<T: Deserialize> Deserialize for Option<T> {
134    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
135        deserializer.read_enum("Option", &["None", "Some"], |dec, var| {
136            match var {
137                0 => Ok(None),
138                1 => Ok(Some(T::deserialize(dec)?)),
139                _ => Err(format!("BinarySerde: Variant index out of bounds."))
140            }
141        })
142    }
143}
144impl<T: Deserialize, E: Deserialize> Deserialize for Result<T, E> {
145    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
146        deserializer.read_enum("Result", &["Ok", "Err"], |dec, var| {
147            match var {
148                0 => Ok(Ok(T::deserialize(dec)?)),
149                1 => Ok(Err(E::deserialize(dec)?)),
150                _ => Err(format!("BinarySerde: Variant index out of bounds."))
151            }
152        })
153    }
154}
155impl Deserialize for () {
156    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
157        deserializer.read_tuple(0, |_| { Ok(()) })
158    }
159}
160impl<T: Deserialize> Deserialize for PhantomData<T> {
161    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
162        deserializer.read_tuple(0, |_| { Ok(PhantomData) })
163    }
164}
165impl<T: Deserialize> Deserialize for Box<T> {
166    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
167        Ok(Box::new(T::deserialize(deserializer)?))
168    }
169}
170// Change this when borrowed data decoding is implemented
171impl<'a, B> Deserialize for Cow<'a, B>
172where B: ToOwned + ?Sized, <B as ToOwned>::Owned: Deserialize {
173    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
174        Ok(Cow::Owned(<B as ToOwned>::Owned::deserialize(deserializer)?))
175    }
176}
177impl<T> Deserialize for HashSet<T>
178where T: Hash + Eq, T: Deserialize {
179    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
180        deserializer.read_seq(|dec, len| {
181            let mut hs = HashSet::with_capacity(len);
182            for _ in 0..len {
183                hs.insert(T::deserialize(dec)?);
184            }
185            
186            Ok(hs)
187        })
188    }
189}
190impl<K, V> Deserialize for HashMap<K, V>
191where K: Hash + Eq, K: Deserialize, V: Deserialize {
192    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
193        deserializer.read_map(|dec, len| {
194            let mut hm = HashMap::with_capacity(len);
195            for _ in 0..len {
196                hm.insert(K::deserialize(dec)?, V::deserialize(dec)?);
197            }
198            
199            Ok(hm)
200        })
201    }
202}
203impl<T> Deserialize for BTreeSet<T>
204where T: Ord, T: Deserialize {
205    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
206        deserializer.read_seq(|dec, len| {
207            let mut bs = BTreeSet::new();
208            for _ in 0..len {
209                bs.insert(T::deserialize(dec)?);
210            }
211            
212            Ok(bs)
213        })
214    }
215}
216impl<K, V> Deserialize for BTreeMap<K, V>
217where K: Ord, K: Deserialize, V: Deserialize {
218    fn deserialize(deserializer: &mut impl Deserializer) -> Result<Self, String> {
219        deserializer.read_map(|dec, len| {
220            let mut bm = BTreeMap::new();
221            for _ in 0..len {
222                bm.insert(K::deserialize(dec)?, V::deserialize(dec)?);
223            }
224            
225            Ok(bm)
226        })
227    }
228}
229// Add more implementations as use cases come up, as well as returning borrowed data (optimization)