1pub mod json;
2
3use std::{
4 collections::HashMap,
5 hash::Hash,
6 io::{self, ErrorKind},
7 marker::PhantomData,
8};
9
10use crate::error::AnyError;
11
12use self::error::visiting_but_expected;
13
14macro_rules! decl_deserialize_primitive {
15 ($deserialize_fn: ident) => {
16 fn $deserialize_fn<V: Visitor>(self, v: V) -> Result<V::Value, AnyError>;
17 };
18}
19
20macro_rules! decl_visit_primitive {
21 ($ttype: ident, $visit_fn: ident) => {
22 fn $visit_fn(self, _v: $ttype) -> Result<Self::Value, AnyError> {
23 Err(visiting_but_expected(stringify!($ttype), &self.expected_a()).into())
24 }
25 };
26}
27
28macro_rules! impl_deserialize_primitive {
29 ($ttype: ident, $visit_fn: ident, $deserialize_fn: ident) => {
30 impl Deserialize for $ttype {
31 fn deserialize<D: Deserializer>(des: D) -> Result<Self, AnyError> {
32 struct PrimitiveVisitor {}
33 impl Visitor for PrimitiveVisitor {
34 type Value = $ttype;
35
36 fn expected_a(self) -> String {
37 stringify!($ttype).to_string()
38 }
39
40 fn $visit_fn(self, val: $ttype) -> Result<Self::Value, AnyError> {
41 Ok(val)
42 }
43 }
44
45 des.$deserialize_fn(PrimitiveVisitor {})
46 }
47 }
48 };
49}
50
51pub trait Deserialize: Sized {
53 fn deserialize<D: Deserializer>(des: D) -> Result<Self, AnyError>;
54}
55
56pub trait Deserializer: Sized {
58 fn deserialize_map<V: Visitor>(self, v: V) -> Result<V::Value, AnyError>;
59 fn deserialize_seq<V: Visitor>(self, v: V) -> Result<V::Value, AnyError>;
60 fn deserialize_struct<V: Visitor>(self, v: V) -> Result<V::Value, AnyError>;
61 fn deserialize_str<V: Visitor>(self, v: V) -> Result<V::Value, AnyError>;
62
63 decl_deserialize_primitive!(deserialize_i8);
64 decl_deserialize_primitive!(deserialize_i16);
65 decl_deserialize_primitive!(deserialize_i32);
66 decl_deserialize_primitive!(deserialize_i64);
67 decl_deserialize_primitive!(deserialize_i128);
68 decl_deserialize_primitive!(deserialize_u8);
69 decl_deserialize_primitive!(deserialize_u16);
70 decl_deserialize_primitive!(deserialize_u32);
71 decl_deserialize_primitive!(deserialize_u64);
72 decl_deserialize_primitive!(deserialize_u128);
73 decl_deserialize_primitive!(deserialize_f32);
74 decl_deserialize_primitive!(deserialize_f64);
75 decl_deserialize_primitive!(deserialize_isize);
76 decl_deserialize_primitive!(deserialize_usize);
77}
78
79pub trait Visitor: Sized {
81 type Value;
82 fn expected_a(self) -> String;
83
84 fn visit_map<M: MapAccess>(self, _map: M) -> Result<Self::Value, AnyError> {
85 Err(visiting_but_expected("map", &self.expected_a()).into())
86 }
87 fn visit_seq<S: SeqAccess>(self, _seq: S) -> Result<Self::Value, AnyError> {
88 Err(visiting_but_expected("seq", &self.expected_a()).into())
89 }
90 fn visit_str(self, _v: &str) -> Result<Self::Value, AnyError> {
91 Err(visiting_but_expected("str", &self.expected_a()).into())
92 }
93
94 decl_visit_primitive!(i8, visit_i8);
95 decl_visit_primitive!(i16, visit_i16);
96 decl_visit_primitive!(i32, visit_i32);
97 decl_visit_primitive!(i64, visit_i64);
98 decl_visit_primitive!(i128, visit_i128);
99 decl_visit_primitive!(u8, visit_u8);
100 decl_visit_primitive!(u16, visit_u16);
101 decl_visit_primitive!(u32, visit_u32);
102 decl_visit_primitive!(u64, visit_u64);
103 decl_visit_primitive!(u128, visit_u128);
104 decl_visit_primitive!(f32, visit_f32);
105 decl_visit_primitive!(f64, visit_f64);
106 decl_visit_primitive!(usize, visit_usize);
107 decl_visit_primitive!(isize, visit_isize);
108}
109
110pub trait MapAccess {
112 fn next_value<V: Deserialize>(&mut self) -> Result<V, AnyError>;
113 fn next_key<K: Deserialize>(&mut self) -> Result<Option<K>, AnyError>;
114}
115
116pub trait SeqAccess {
118 fn next_value<V: Deserialize>(&mut self) -> Result<Option<V>, AnyError>;
119}
120
121mod error {
124 pub(crate) fn visiting_but_expected(etype: &str, gtype: &str) -> String {
125 "visiting a ".to_string() + etype + " but expected a " + gtype
126 }
127}
128
129pub trait Peek {
133 fn peek(&mut self) -> Result<Option<u8>, AnyError>;
134 fn read_until(&mut self, end: &[u8]) -> Result<Vec<u8>, AnyError>;
135 fn consume(&mut self) -> Result<(), AnyError>;
136 fn consume_matching(&mut self, matches: &[u8]) -> Result<(), AnyError>;
137}
138
139impl<R: io::Read + io::Seek> Peek for R {
140 fn peek(&mut self) -> Result<Option<u8>, AnyError> {
141 let start = self.stream_position()?;
142 let mut char: [u8; 1] = [0];
143 let char = match self.read_exact(&mut char) {
144 Ok(_) => Ok(Some(char)),
145 Err(ref e) if e.kind() == ErrorKind::UnexpectedEof => Ok(None),
146 Err(err) => Err(err),
147 };
148 self.seek(io::SeekFrom::Start(start))?;
149 char.map(|o| {
150 if o.is_some() {
151 return Some(*o.unwrap().get(0).unwrap());
152 }
153 return None;
154 })
155 .map_err(|e| e.into())
156 }
157
158 fn consume(&mut self) -> Result<(), AnyError> {
159 self.seek(io::SeekFrom::Current(1))?;
160 Ok(())
161 }
162
163 fn consume_matching(&mut self, matches: &[u8]) -> Result<(), AnyError> {
164 loop {
165 let char = self.peek()?;
166 if char.is_some() && matches.contains(&char.unwrap()) {
167 self.consume()?;
168 } else {
169 break;
170 }
171 }
172 Ok(())
173 }
174
175 fn read_until(&mut self, end: &[u8]) -> Result<Vec<u8>, AnyError> {
176 let mut vec = vec![];
177 loop {
178 let char = self.peek()?;
179 if char.is_some() && !end.contains(&char.unwrap()) {
180 self.consume()?;
181 vec.push(char.unwrap());
182 } else {
183 break;
184 }
185 }
186 Ok(vec)
187 }
188}
189
190impl Deserialize for String {
192 fn deserialize<D: Deserializer>(des: D) -> Result<Self, AnyError> {
193 struct StringVisitor {}
194 impl Visitor for StringVisitor {
195 type Value = String;
196
197 fn expected_a(self) -> String {
198 "string".to_string()
199 }
200
201 fn visit_str(self, v: &str) -> Result<Self::Value, AnyError> {
202 Ok(v.to_string())
203 }
204 }
205
206 des.deserialize_str(StringVisitor {})
207 }
208}
209
210impl<I: Deserialize> Deserialize for Vec<I> {
211 fn deserialize<D: Deserializer>(des: D) -> Result<Self, AnyError> {
212 struct VecVisitor<I> {
213 marker: PhantomData<I>,
214 }
215 impl<I: Deserialize> Visitor for VecVisitor<I> {
216 type Value = Vec<I>;
217
218 fn expected_a(self) -> String {
219 "vec".to_string()
220 }
221
222 fn visit_seq<S: SeqAccess>(self, mut seq: S) -> Result<Self::Value, AnyError> {
223 let mut vec = vec![];
224
225 while let Some(item) = seq.next_value()? {
226 vec.push(item);
227 }
228
229 Ok(vec)
230 }
231 }
232
233 des.deserialize_seq(VecVisitor {
234 marker: PhantomData::<I>,
235 })
236 }
237}
238
239impl<K: Deserialize + Hash + Eq, V: Deserialize> Deserialize for HashMap<K, V> {
240 fn deserialize<D: Deserializer>(des: D) -> Result<Self, AnyError> {
241 struct HashMapVisitor<K, V> {
242 k_marker: PhantomData<K>,
243 v_marker: PhantomData<V>,
244 }
245 impl<K: Deserialize + Hash + Eq, V: Deserialize> Visitor for HashMapVisitor<K, V> {
246 type Value = HashMap<K, V>;
247
248 fn expected_a(self) -> String {
249 "hashmap".to_string()
250 }
251
252 fn visit_map<M: MapAccess>(self, mut map: M) -> Result<Self::Value, AnyError> {
253 let mut tmp = HashMap::new();
254
255 while let Some(key) = map.next_key()? {
256 let value = map.next_value()?;
257 tmp.insert(key, value);
258 }
259
260 Ok(tmp)
261 }
262 }
263
264 des.deserialize_map(HashMapVisitor {
265 k_marker: PhantomData,
266 v_marker: PhantomData,
267 })
268 }
269}
270
271impl_deserialize_primitive!(i8, visit_i8, deserialize_i8);
272impl_deserialize_primitive!(i16, visit_i16, deserialize_i16);
273impl_deserialize_primitive!(i32, visit_i32, deserialize_i32);
274impl_deserialize_primitive!(i64, visit_i64, deserialize_i64);
275impl_deserialize_primitive!(i128, visit_i128, deserialize_i128);
276impl_deserialize_primitive!(u8, visit_u8, deserialize_u8);
277impl_deserialize_primitive!(u16, visit_u16, deserialize_u16);
278impl_deserialize_primitive!(u32, visit_u32, deserialize_u32);
279impl_deserialize_primitive!(u64, visit_u64, deserialize_u64);
280impl_deserialize_primitive!(u128, visit_u128, deserialize_u128);
281impl_deserialize_primitive!(f32, visit_f32, deserialize_f32);
282impl_deserialize_primitive!(f64, visit_f64, deserialize_f64);
283impl_deserialize_primitive!(isize, visit_isize, deserialize_isize);
284impl_deserialize_primitive!(usize, visit_usize, deserialize_usize);