spyne_encoding/serialization/
deserialize.rs1use 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}
170impl<'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