1use crate::{Error, RESPType, Result};
2
3use serde::de::{self, DeserializeOwned, DeserializeSeed, SeqAccess, Visitor};
4use serde::Deserialize;
5
6use std::fmt;
7use std::io::{BufRead, BufReader, Cursor, Read};
8
9pub struct Deserializer<'de, R: BufRead> {
11 reader: &'de mut R,
12}
13
14impl<'de, R: BufRead> Deserializer<'de, R> {
15 pub fn from_buf_reader(reader: &'de mut R) -> Deserializer<'de, R> {
17 Deserializer { reader }
18 }
19}
20
21pub fn from_str<T>(s: &str) -> Result<T>
28where
29 T: DeserializeOwned,
30{
31 let mut reader = Cursor::new(s);
32 from_buf_reader(&mut reader)
33}
34
35pub fn from_reader<T, R>(reader: &mut R) -> Result<T>
43where
44 T: DeserializeOwned,
45 R: Read,
46{
47 let mut reader = BufReader::new(reader);
48 from_buf_reader(&mut reader)
49}
50
51pub fn from_buf_reader<T, R>(reader: &mut R) -> Result<T>
56where
57 T: DeserializeOwned,
58 R: BufRead,
59{
60 let mut deserializer = Deserializer::from_buf_reader(reader);
61 let t = T::deserialize(&mut deserializer)?;
62 Ok(t)
63}
64
65impl<'de, R: BufRead> Deserializer<'de, R> {
66 fn read_isize(&mut self) -> Result<isize> {
68 let mut buffer = String::new();
69 self.reader.read_line(&mut buffer)?;
70 let trimmed = buffer.trim_end();
71 match trimmed.parse::<isize>() {
72 Ok(x) => Ok(x),
73 Err(_) => Err(Error::Syntax),
74 }
75 }
76}
77
78impl<'de, 'a, R: BufRead> de::Deserializer<'de> for &'a mut Deserializer<'de, R> {
79 type Error = Error;
80
81 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
83 where
84 V: Visitor<'de>,
85 {
86 let mut buf = [0u8; 1];
87 self.reader.read_exact(&mut buf)?;
88 match buf[0] {
89 b'+' => self.deserialize_str(visitor), b'-' => self.deserialize_string(visitor), b':' => self.deserialize_i64(visitor), b'$' => self.deserialize_byte_buf(visitor), b'*' => self.deserialize_seq(visitor), _ => return Err(Error::Syntax),
95 }
96 }
97
98 fn deserialize_bool<V>(self, _visitor: V) -> Result<V::Value>
99 where
100 V: Visitor<'de>,
101 {
102 unimplemented!()
103 }
104
105 fn deserialize_i8<V>(self, _visitor: V) -> Result<V::Value>
106 where
107 V: Visitor<'de>,
108 {
109 unimplemented!()
110 }
111
112 fn deserialize_i16<V>(self, _visitor: V) -> Result<V::Value>
113 where
114 V: Visitor<'de>,
115 {
116 unimplemented!()
117 }
118
119 fn deserialize_i32<V>(self, _visitor: V) -> Result<V::Value>
120 where
121 V: Visitor<'de>,
122 {
123 unimplemented!()
124 }
125
126 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value>
127 where
128 V: Visitor<'de>,
129 {
130 let mut buffer = String::new();
131 self.reader.read_line(&mut buffer)?;
132 match buffer.trim_end().parse::<i64>() {
133 Ok(x) => visitor.visit_i64(x),
134 Err(_) => Err(Error::Syntax),
135 }
136 }
137
138 fn deserialize_u8<V>(self, _visitor: V) -> Result<V::Value>
139 where
140 V: Visitor<'de>,
141 {
142 unimplemented!()
143 }
144
145 fn deserialize_u16<V>(self, _visitor: V) -> Result<V::Value>
146 where
147 V: Visitor<'de>,
148 {
149 unimplemented!()
150 }
151
152 fn deserialize_u32<V>(self, _visitor: V) -> Result<V::Value>
153 where
154 V: Visitor<'de>,
155 {
156 unimplemented!()
157 }
158
159 fn deserialize_u64<V>(self, _visitor: V) -> Result<V::Value>
160 where
161 V: Visitor<'de>,
162 {
163 unimplemented!()
164 }
165
166 fn deserialize_f32<V>(self, _visitor: V) -> Result<V::Value>
167 where
168 V: Visitor<'de>,
169 {
170 unimplemented!()
171 }
172
173 fn deserialize_f64<V>(self, _visitor: V) -> Result<V::Value>
174 where
175 V: Visitor<'de>,
176 {
177 unimplemented!()
178 }
179
180 fn deserialize_char<V>(self, _visitor: V) -> Result<V::Value>
181 where
182 V: Visitor<'de>,
183 {
184 unimplemented!()
185 }
186
187 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
189 where
190 V: Visitor<'de>,
191 {
192 let mut buffer = String::new();
193 self.reader.read_line(&mut buffer)?;
194 visitor.visit_str(buffer.trim_end())
195 }
196
197 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
199 where
200 V: Visitor<'de>,
201 {
202 let mut buffer = String::new();
203 self.reader.read_line(&mut buffer)?;
204 visitor.visit_string(buffer.trim_end().to_string())
205 }
206
207 fn deserialize_bytes<V>(self, _visitor: V) -> Result<V::Value>
208 where
209 V: Visitor<'de>,
210 {
211 unimplemented!()
212 }
213
214 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
216 where
217 V: Visitor<'de>,
218 {
219 let x = self.read_isize()?;
220 if x < 0 {
221 return visitor.visit_none();
222 }
223 let mut buffer = vec![0u8; (x + 2) as usize]; self.reader.read_exact(&mut buffer)?;
225 if buffer.split_off(x as usize) != b"\r\n" {
226 return Err(Error::Syntax); }
228 visitor.visit_byte_buf(buffer)
229 }
230
231 fn deserialize_option<V>(self, _visitor: V) -> Result<V::Value>
232 where
233 V: Visitor<'de>,
234 {
235 unimplemented!()
236 }
237
238 fn deserialize_unit<V>(self, _visitor: V) -> Result<V::Value>
239 where
240 V: Visitor<'de>,
241 {
242 unimplemented!()
243 }
244
245 fn deserialize_unit_struct<V>(self, _name: &'static str, _visitor: V) -> Result<V::Value>
246 where
247 V: Visitor<'de>,
248 {
249 unimplemented!()
250 }
251
252 fn deserialize_newtype_struct<V>(self, _name: &'static str, _visitor: V) -> Result<V::Value>
253 where
254 V: Visitor<'de>,
255 {
256 unimplemented!()
257 }
258
259 fn deserialize_seq<V>(mut self, visitor: V) -> Result<V::Value>
263 where
264 V: Visitor<'de>,
265 {
266 let x = self.read_isize()?;
267 if x < 0 {
268 return visitor.visit_unit();
269 }
270 visitor.visit_seq(RESPArray::new(&mut self, x as usize))
271 }
272
273 fn deserialize_tuple<V>(self, _len: usize, _visitor: V) -> Result<V::Value>
274 where
275 V: Visitor<'de>,
276 {
277 unimplemented!()
278 }
279
280 fn deserialize_tuple_struct<V>(
281 self,
282 _name: &'static str,
283 _len: usize,
284 _visitor: V,
285 ) -> Result<V::Value>
286 where
287 V: Visitor<'de>,
288 {
289 unimplemented!()
290 }
291
292 fn deserialize_map<V>(self, _visitor: V) -> Result<V::Value>
293 where
294 V: Visitor<'de>,
295 {
296 unimplemented!()
297 }
298
299 fn deserialize_struct<V>(
300 self,
301 _name: &'static str,
302 _fields: &'static [&'static str],
303 _visitor: V,
304 ) -> Result<V::Value>
305 where
306 V: Visitor<'de>,
307 {
308 unimplemented!()
309 }
310
311 fn deserialize_enum<V>(
312 self,
313 _name: &'static str,
314 _variants: &'static [&'static str],
315 _visitor: V,
316 ) -> Result<V::Value>
317 where
318 V: Visitor<'de>,
319 {
320 unimplemented!()
321 }
322
323 fn deserialize_identifier<V>(self, _visitor: V) -> Result<V::Value>
324 where
325 V: Visitor<'de>,
326 {
327 unimplemented!()
328 }
329
330 fn deserialize_ignored_any<V>(self, _visitor: V) -> Result<V::Value>
331 where
332 V: Visitor<'de>,
333 {
334 unimplemented!()
335 }
336}
337
338struct RESPArray<'a, 'de: 'a, R: BufRead> {
339 de: &'a mut Deserializer<'de, R>,
340 remain_len: usize,
341}
342
343impl<'a, 'de, R: BufRead> RESPArray<'a, 'de, R> {
344 fn new(de: &'a mut Deserializer<'de, R>, len: usize) -> Self {
345 RESPArray {
346 de,
347 remain_len: len,
348 }
349 }
350}
351
352impl<'de, 'a, R: BufRead> SeqAccess<'de> for RESPArray<'a, 'de, R> {
355 type Error = Error;
356
357 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
358 where
359 T: DeserializeSeed<'de>,
360 {
361 if self.remain_len == 0 {
362 return Ok(None);
363 }
364 self.remain_len -= 1;
365 seed.deserialize(&mut *self.de).map(Some)
366 }
367
368 fn size_hint(&self) -> Option<usize> {
369 Some(self.remain_len)
370 }
371}
372
373struct RESPTypeVisitor;
374
375impl<'de> Visitor<'de> for RESPTypeVisitor {
376 type Value = RESPType;
377
378 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
379 formatter.write_str("A RESP value")
380 }
381
382 fn visit_i64<E>(self, v: i64) -> std::result::Result<Self::Value, E>
383 where
384 E: de::Error,
385 {
386 Ok(RESPType::Integer(v))
387 }
388
389 fn visit_str<E>(self, v: &str) -> std::result::Result<Self::Value, E>
391 where
392 E: de::Error,
393 {
394 Ok(RESPType::SimpleString(v.to_string()))
395 }
396
397 fn visit_string<E>(self, v: String) -> std::result::Result<Self::Value, E>
399 where
400 E: de::Error,
401 {
402 Ok(RESPType::Error(v))
403 }
404
405 fn visit_byte_buf<E>(self, v: Vec<u8>) -> std::result::Result<Self::Value, E>
407 where
408 E: de::Error,
409 {
410 Ok(RESPType::BulkString(Some(v)))
411 }
412
413 fn visit_none<E>(self) -> std::result::Result<Self::Value, E>
415 where
416 E: de::Error,
417 {
418 Ok(RESPType::BulkString(None))
419 }
420
421 fn visit_unit<E>(self) -> std::result::Result<Self::Value, E>
423 where
424 E: de::Error,
425 {
426 Ok(RESPType::Array(None))
427 }
428
429 fn visit_seq<A>(
430 self,
431 mut seq: A,
432 ) -> std::result::Result<Self::Value, <A as SeqAccess<'de>>::Error>
433 where
434 A: SeqAccess<'de>,
435 {
436 let mut arr: Vec<RESPType> = Vec::with_capacity(seq.size_hint().unwrap_or_default());
437 loop {
438 match seq.next_element()? {
439 None => break,
440 Some(elem) => arr.push(elem),
441 };
442 }
443 Ok(RESPType::Array(Some(arr)))
444 }
445}
446
447impl<'de> Deserialize<'de> for RESPType {
448 fn deserialize<D>(
449 deserializer: D,
450 ) -> std::result::Result<Self, <D as de::Deserializer<'de>>::Error>
451 where
452 D: de::Deserializer<'de>,
453 {
454 deserializer.deserialize_any(RESPTypeVisitor)
455 }
456}