1use super::error::Error;
2use crate::Value;
3use serde::{
4 de::{self, DeserializeSeed, EnumAccess, MapAccess, SeqAccess, VariantAccess, Visitor},
5 Deserialize,
6};
7use std::{collections::VecDeque, marker::PhantomData, str::FromStr};
8
9#[derive(Clone, Debug)]
14enum Token {
15 Bool(bool),
16 Int(i64),
17 Float(f64),
18 String(String),
19 Count(usize),
20}
21
22impl Token {
23 fn into_bool(self) -> Result<bool, Token> {
24 match self {
25 Token::Bool(v) => Ok(v),
26 _ => Err(self),
27 }
28 }
29
30 fn into_int(self) -> Result<i64, Token> {
31 match self {
32 Token::Int(v) => Ok(v),
33 _ => Err(self),
34 }
35 }
36
37 fn into_float(self) -> Result<f64, Token> {
38 match self {
39 Token::Float(v) => Ok(v),
40 _ => Err(self),
41 }
42 }
43
44 fn into_string(self) -> Result<String, Token> {
45 match self {
46 Token::String(v) => Ok(v),
47 _ => Err(self),
48 }
49 }
50
51 fn into_count(self) -> Result<usize, Token> {
52 match self {
53 Token::Count(v) => Ok(v),
54 _ => Err(self),
55 }
56 }
57}
58
59fn flatten(res: &mut VecDeque<Token>, value: Value) {
60 match value {
61 Value::Bool(b) => {
62 res.push_back(Token::Bool(b));
63 }
64 Value::Int(i) => {
65 res.push_back(Token::Int(i));
66 }
67 Value::Float(f) => {
68 res.push_back(Token::Float(f));
69 }
70 Value::String(s) => {
71 res.push_back(Token::String(s));
72 }
73 Value::Array(a, _) => {
74 res.push_back(Token::Count(a.len()));
75 for v in a {
76 flatten(res, v)
77 }
78 }
79 Value::Object(o) => {
80 res.push_back(Token::Count(o.len()));
81 for (k, v) in o {
82 res.push_back(Token::String(k));
83 flatten(res, v)
84 }
85 }
86 }
87}
88
89pub struct Deserializer<'de> {
90 tokens: VecDeque<Token>,
91 phantom: PhantomData<&'de str>,
92}
93
94pub fn from_str<'a, T>(s: &'a str) -> Result<T, Error>
95where
96 T: Deserialize<'a>,
97{
98 let value = crate::Value::from_str(s).map_err(|e| Error::Message(format!("{e:?}")))?;
99
100 let mut tokens = VecDeque::new();
101
102 flatten(&mut tokens, value);
103
104 let mut deserializer = Deserializer::<'a> {
105 tokens,
106 phantom: PhantomData,
107 };
108
109 T::deserialize(&mut deserializer)
110}
111
112impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
113 type Error = Error;
114
115 fn deserialize_any<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
116 where
117 V: Visitor<'de>,
118 {
119 panic!("Format needs type hints!");
120 }
121
122 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
123 where
124 V: Visitor<'de>,
125 {
126 let token = self
127 .tokens
128 .pop_front()
129 .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
130
131 visitor.visit_bool(
132 token
133 .into_bool()
134 .map_err(|t| Error::Message(format!("{t:?} is not a bool")))?,
135 )
136 }
137
138 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
139 where
140 V: Visitor<'de>,
141 {
142 let token = self
143 .tokens
144 .pop_front()
145 .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
146
147 visitor.visit_i8(
148 token
149 .into_int()
150 .map_err(|t| Error::Message(format!("{t:?} is not a integer")))? as i8,
151 )
152 }
153
154 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
155 where
156 V: Visitor<'de>,
157 {
158 let token = self
159 .tokens
160 .pop_front()
161 .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
162
163 visitor.visit_i16(
164 token
165 .into_int()
166 .map_err(|t| Error::Message(format!("{t:?} is not a integer")))? as i16,
167 )
168 }
169
170 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
171 where
172 V: Visitor<'de>,
173 {
174 let token = self
175 .tokens
176 .pop_front()
177 .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
178
179 visitor.visit_i32(
180 token
181 .into_int()
182 .map_err(|t| Error::Message(format!("{t:?} is not a integer")))? as i32,
183 )
184 }
185
186 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
187 where
188 V: Visitor<'de>,
189 {
190 let token = self
191 .tokens
192 .pop_front()
193 .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
194
195 visitor.visit_i64(
196 token
197 .into_int()
198 .map_err(|t| Error::Message(format!("{t:?} is not a integer")))?,
199 )
200 }
201
202 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
203 where
204 V: Visitor<'de>,
205 {
206 let token = self
207 .tokens
208 .pop_front()
209 .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
210
211 visitor.visit_u8(
212 token
213 .into_int()
214 .map_err(|t| Error::Message(format!("{t:?} is not a integer")))? as u8,
215 )
216 }
217
218 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
219 where
220 V: Visitor<'de>,
221 {
222 let token = self
223 .tokens
224 .pop_front()
225 .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
226
227 visitor.visit_u16(
228 token
229 .into_int()
230 .map_err(|t| Error::Message(format!("{t:?} is not a integer")))? as u16,
231 )
232 }
233
234 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
235 where
236 V: Visitor<'de>,
237 {
238 let token = self
239 .tokens
240 .pop_front()
241 .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
242
243 visitor.visit_u32(
244 token
245 .into_int()
246 .map_err(|t| Error::Message(format!("{t:?} is not a integer")))? as u32,
247 )
248 }
249
250 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
251 where
252 V: Visitor<'de>,
253 {
254 let token = self
255 .tokens
256 .pop_front()
257 .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
258
259 visitor.visit_u64(
260 token
261 .into_int()
262 .map_err(|t| Error::Message(format!("{t:?} is not a integer")))? as u64,
263 )
264 }
265
266 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
267 where
268 V: Visitor<'de>,
269 {
270 let token = self
271 .tokens
272 .pop_front()
273 .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
274
275 visitor.visit_f32(
276 token
277 .into_float()
278 .map_err(|t| Error::Message(format!("{t:?} is not a float")))? as f32,
279 )
280 }
281
282 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
283 where
284 V: Visitor<'de>,
285 {
286 let token = self
287 .tokens
288 .pop_front()
289 .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
290
291 visitor.visit_f64(
292 token
293 .into_float()
294 .map_err(|t| Error::Message(format!("{t:?} is not a float")))?,
295 )
296 }
297
298 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
299 where
300 V: Visitor<'de>,
301 {
302 let token = self
303 .tokens
304 .pop_front()
305 .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
306
307 visitor.visit_char(
308 token
309 .into_string()
310 .map_err(|t| Error::Message(format!("{t:?} is not a char")))?
311 .chars()
312 .next()
313 .ok_or_else(|| Error::Message("String is empty".into()))?,
314 )
315 }
316
317 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
318 where
319 V: Visitor<'de>,
320 {
321 let token = self
322 .tokens
323 .pop_front()
324 .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
325
326 visitor.visit_str(
327 token
328 .into_string()
329 .map_err(|t| Error::Message(format!("{t:?} is not a str")))?
330 .as_str(),
331 )
332 }
333
334 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
335 where
336 V: Visitor<'de>,
337 {
338 let token = self
339 .tokens
340 .pop_front()
341 .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
342
343 visitor.visit_string(
344 token
345 .into_string()
346 .map_err(|t| Error::Message(format!("{t:?} is not a str")))?,
347 )
348 }
349
350 fn deserialize_bytes<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
351 where
352 V: Visitor<'de>,
353 {
354 unimplemented!("")
355 }
356
357 fn deserialize_byte_buf<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
358 where
359 V: Visitor<'de>,
360 {
361 unimplemented!("")
362 }
363
364 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
365 where
366 V: Visitor<'de>,
367 {
368 let len = self
369 .tokens
370 .pop_front()
371 .ok_or_else(|| Error::Message("Reached end of input!".into()))?
372 .into_count()
373 .map_err(|t| Error::Message(format!("{t:?} is not a count")))?;
374
375 if len == 0 {
376 visitor.visit_none()
377 } else {
378 visitor.visit_some(self)
379 }
380 }
381
382 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
383 where
384 V: Visitor<'de>,
385 {
386 let len = self
387 .tokens
388 .pop_front()
389 .ok_or_else(|| Error::Message("Reached end of input!".into()))?
390 .into_count()
391 .map_err(|t| Error::Message(format!("{t:?} is not a count")))?;
392
393 if len == 0 {
394 visitor.visit_unit()
395 } else {
396 Err(Error::Message("Expected empty list".into()))
397 }
398 }
399
400 fn deserialize_unit_struct<V>(
401 self,
402 _name: &'static str,
403 visitor: V,
404 ) -> Result<V::Value, Self::Error>
405 where
406 V: Visitor<'de>,
407 {
408 self.deserialize_unit(visitor)
409 }
410
411 fn deserialize_newtype_struct<V>(
412 self,
413 _name: &'static str,
414 visitor: V,
415 ) -> Result<V::Value, Self::Error>
416 where
417 V: Visitor<'de>,
418 {
419 let len = self
420 .tokens
421 .pop_front()
422 .ok_or_else(|| Error::Message("Reached end of input!".into()))?
423 .into_count()
424 .map_err(|t| Error::Message(format!("{t:?} is not a count")))?;
425
426 if len != 1 {
427 return Err(Error::Message(format!(
428 "Expected 1 field in struct got {len}"
429 )));
430 }
431
432 visitor.visit_newtype_struct(self)
433 }
434
435 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
436 where
437 V: Visitor<'de>,
438 {
439 let count = self
440 .tokens
441 .pop_front()
442 .ok_or_else(|| Error::Message("Reached end of input!".into()))?
443 .into_count()
444 .map_err(|t| Error::Message(format!("Expected field count, got {t:?}")))?;
445
446 visitor.visit_seq(SeqAccessor {
447 de: self,
448 remaining: count,
449 })
450 }
451
452 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
453 where
454 V: Visitor<'de>,
455 {
456 self.deserialize_seq(visitor)
457 }
458
459 fn deserialize_tuple_struct<V>(
460 self,
461 _name: &'static str,
462 _len: usize,
463 visitor: V,
464 ) -> Result<V::Value, Self::Error>
465 where
466 V: Visitor<'de>,
467 {
468 self.deserialize_seq(visitor)
469 }
470
471 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
472 where
473 V: Visitor<'de>,
474 {
475 let count = self
476 .tokens
477 .pop_front()
478 .ok_or_else(|| Error::Message("Reached end of input!".into()))?
479 .into_count()
480 .map_err(|t| Error::Message(format!("Expected field count, got {t:?}")))?;
481
482 visitor.visit_map(MapAccessor {
483 de: self,
484 remaining: count,
485 })
486 }
487
488 fn deserialize_struct<V>(
489 self,
490 _name: &'static str,
491 _fields: &'static [&'static str],
492 visitor: V,
493 ) -> Result<V::Value, Self::Error>
494 where
495 V: Visitor<'de>,
496 {
497 let count = self
498 .tokens
499 .pop_front()
500 .ok_or_else(|| Error::Message("Reached end of input!".into()))?
501 .into_count()
502 .map_err(|t| Error::Message(format!("Expected field count, got {t:?}")))?;
503
504 visitor.visit_map(StructAccessor {
505 de: self,
506 remaining: count,
507 })
508 }
509
510 fn deserialize_enum<V>(
511 self,
512 _name: &'static str,
513 _variants: &'static [&'static str],
514 visitor: V,
515 ) -> Result<V::Value, Self::Error>
516 where
517 V: Visitor<'de>,
518 {
519 if let Some(Token::Count(_)) = self.tokens.front() {
520 self.tokens.pop_front();
521 };
522
523 visitor.visit_enum(Enum::new(self))
524 }
525
526 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
527 where
528 V: Visitor<'de>,
529 {
530 let token = self
531 .tokens
532 .pop_front()
533 .ok_or_else(|| Error::Message("Reached end of input!".into()))?
534 .into_string()
535 .map_err(|t| Error::Message(format!("{t:?} is not an identifier")))?;
536
537 visitor.visit_str(token.as_str())
538 }
539
540 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
541 where
542 V: Visitor<'de>,
543 {
544 self.deserialize_any(visitor)
545 }
546}
547
548struct SeqAccessor<'a, 'de: 'a> {
549 de: &'a mut Deserializer<'de>,
550 remaining: usize,
551}
552
553impl<'de, 'a> SeqAccess<'de> for SeqAccessor<'a, 'de> {
554 type Error = Error;
555
556 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
557 where
558 T: DeserializeSeed<'de>,
559 {
560 if self.remaining > 0 {
561 self.remaining -= 1;
562 seed.deserialize(&mut *self.de).map(Some)
563 } else {
564 Ok(None)
565 }
566 }
567}
568
569struct StructAccessor<'a, 'de: 'a> {
570 de: &'a mut Deserializer<'de>,
571 remaining: usize,
572}
573
574impl<'de, 'a> MapAccess<'de> for StructAccessor<'a, 'de> {
575 type Error = Error;
576
577 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
578 where
579 K: DeserializeSeed<'de>,
580 {
581 if self.remaining > 0 {
582 self.remaining -= 1;
583 seed.deserialize(&mut *self.de).map(Some)
584 } else {
585 Ok(None)
586 }
587 }
588
589 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
590 where
591 V: DeserializeSeed<'de>,
592 {
593 seed.deserialize(&mut *self.de)
594 }
595}
596
597struct MapAccessor<'a, 'de: 'a> {
598 de: &'a mut Deserializer<'de>,
599 remaining: usize,
600}
601
602impl<'de, 'a> MapAccess<'de> for MapAccessor<'a, 'de> {
603 type Error = Error;
604
605 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
606 where
607 K: DeserializeSeed<'de>,
608 {
609 if self.remaining > 0 {
610 self.remaining -= 1;
611 let count = self
612 .de
613 .tokens
614 .pop_front()
615 .ok_or_else(|| Error::Message("Reached end of input!".into()))?
616 .into_count()
617 .map_err(|t| Error::Message(format!("{t:?} is not a count")))?;
618
619 if count != 2 {
620 return Err(Error::Message(
621 "Map does not contain list of key value pairs".into(),
622 ));
623 }
624
625 seed.deserialize(&mut *self.de).map(Some)
626 } else {
627 Ok(None)
628 }
629 }
630
631 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
632 where
633 V: DeserializeSeed<'de>,
634 {
635 seed.deserialize(&mut *self.de)
636 }
637}
638
639struct Enum<'a, 'de: 'a> {
640 de: &'a mut Deserializer<'de>,
641}
642
643impl<'a, 'de> Enum<'a, 'de> {
644 fn new(de: &'a mut Deserializer<'de>) -> Self {
645 Enum { de }
646 }
647}
648
649impl<'de, 'a> EnumAccess<'de> for Enum<'a, 'de> {
650 type Error = Error;
651 type Variant = Self;
652
653 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
654 where
655 V: DeserializeSeed<'de>,
656 {
657 Ok((seed.deserialize(&mut *self.de)?, self))
658 }
659}
660
661impl<'de, 'a> VariantAccess<'de> for Enum<'a, 'de> {
662 type Error = Error;
663
664 fn unit_variant(self) -> Result<(), Self::Error> {
665 Ok(())
666 }
667
668 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
669 where
670 T: DeserializeSeed<'de>,
671 {
672 self.de.tokens.pop_front();
673 seed.deserialize(self.de)
674 }
675
676 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
677 where
678 V: Visitor<'de>,
679 {
680 de::Deserializer::deserialize_seq(self.de, visitor)
681 }
682
683 fn struct_variant<V>(
684 self,
685 _fields: &'static [&'static str],
686 visitor: V,
687 ) -> Result<V::Value, Self::Error>
688 where
689 V: Visitor<'de>,
690 {
691 de::Deserializer::deserialize_struct(self.de, "", &[], visitor)
692 }
693}