1use serde::de::{
2 self, DeserializeSeed, EnumAccess, IntoDeserializer, MapAccess, SeqAccess, VariantAccess,
3 Visitor,
4};
5use serde::Deserialize;
6
7use crate::error::{ArrayKeyError, ArrayKeyErrorKind, ExpectToken, ResultExt, TrailingError};
8use crate::lexer::{SpannedToken, Token};
9use crate::num::ParseIntError;
10use crate::parser::{ArraySyntax, Parser};
11use crate::{Key, ParseError};
12use std::collections::VecDeque;
13use std::convert::TryFrom;
14
15type Result<T> = std::result::Result<T, ParseError>;
16
17pub struct Deserializer<'de> {
18 parser: Parser<'de>,
19 peeked: VecDeque<SpannedToken<'de>>,
20}
21
22impl<'de> Deserializer<'de> {
23 pub fn from_str(input: &'de str) -> Self {
24 Deserializer {
25 parser: Parser::new(input),
26 peeked: Default::default(),
27 }
28 }
29
30 pub fn source(&self) -> &'de str {
31 self.parser.source()
32 }
33}
34
35pub fn from_str<'a, T>(s: &'a str) -> Result<T>
54where
55 T: Deserialize<'a>,
56{
57 let mut deserializer = Deserializer::from_str(s);
58 let t = T::deserialize(&mut deserializer)?;
59 match deserializer.next_token() {
60 None
61 | Some(SpannedToken {
62 token: Token::SemiColon,
63 ..
64 }) => Ok(t),
65 Some(token) => Err(TrailingError::new(s, token.span.start..token.span.start).into()),
66 }
67}
68
69impl<'de> Deserializer<'de> {
70 fn next_token(&mut self) -> Option<SpannedToken<'de>> {
71 self.peeked.pop_front().or_else(|| self.parser.next_token())
72 }
73
74 fn peek_token(&mut self) -> Option<&SpannedToken<'de>> {
75 if self.peeked.is_empty() {
76 let next = self.next_token()?;
77 self.peeked.push_back(next)
78 }
79 self.peeked.front()
80 }
81
82 fn eat_token(&mut self) {
83 let _ = self.next_token();
84 }
85
86 fn parse_bool(&mut self) -> Result<bool> {
87 let token = self
88 .next_token()
89 .expect_token(&[Token::Bool], self.source())?;
90 self.parser.parse_bool_token(token)
91 }
92
93 fn push_peeked(&mut self, peeked: SpannedToken<'de>) {
94 self.peeked.push_front(peeked)
95 }
96
97 fn parse_unsigned<T>(&mut self) -> Result<T>
98 where
99 T: TryFrom<i64>,
100 {
101 let token = self
102 .next_token()
103 .expect_token(&[Token::Integer], self.source())?;
104 let span = token.span.clone();
105 let int = self.parser.parse_int_token(token)?;
106 if int < 0 {
107 Err(ParseIntError::UnexpectedNegative).with_span(span, self.source())
108 } else {
109 Ok(T::try_from(int)
110 .or_else(|_| Err(ParseIntError::Overflow).with_span(span, self.source()))?)
111 }
112 }
113
114 fn parse_signed<T>(&mut self) -> Result<T>
115 where
116 T: TryFrom<i64>,
117 {
118 let token = self
119 .next_token()
120 .expect_token(&[Token::Integer], self.source())?;
121 let span = token.span.clone();
122 T::try_from(self.parser.parse_int_token(token)?)
123 .or_else(|_| Err(ParseIntError::Overflow).with_span(span, self.source()))
124 }
125
126 fn parse_float(&mut self) -> Result<f64> {
127 let token = self
128 .next_token()
129 .expect_token(&[Token::Float], self.source())?;
130 self.parser.parse_float_token(token)
131 }
132
133 fn parse_string(&mut self) -> Result<String> {
134 let token = self
135 .next_token()
136 .expect_token(&[Token::LiteralString], self.source())?;
137 self.parser.parse_string_token(token)
138 }
139}
140
141impl<'de> de::Deserializer<'de> for &mut Deserializer<'de> {
142 type Error = ParseError;
143
144 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
145 where
146 V: Visitor<'de>,
147 {
148 let source = self.source();
149 let peek = self.peek_token().expect_token(
150 &[
151 Token::Null,
152 Token::Bool,
153 Token::LiteralString,
154 Token::Integer,
155 Token::Float,
156 Token::Array,
157 Token::SquareOpen,
158 ],
159 source,
160 )?;
161 match peek.token {
162 Token::Null => self.deserialize_unit(visitor),
163 Token::Bool => self.deserialize_bool(visitor),
164 Token::LiteralString => self.deserialize_string(visitor),
165 Token::Integer => self.deserialize_i64(visitor),
166 Token::Float => self.deserialize_f64(visitor),
167 Token::Array | Token::SquareOpen => self.deserialize_map(visitor),
168 _ => unreachable!(),
169 }
170 }
171
172 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
173 where
174 V: Visitor<'de>,
175 {
176 visitor.visit_bool(self.parse_bool()?)
177 }
178
179 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value>
182 where
183 V: Visitor<'de>,
184 {
185 visitor.visit_i8(self.parse_signed()?)
186 }
187
188 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value>
189 where
190 V: Visitor<'de>,
191 {
192 visitor.visit_i16(self.parse_signed()?)
193 }
194
195 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value>
196 where
197 V: Visitor<'de>,
198 {
199 visitor.visit_i32(self.parse_signed()?)
200 }
201
202 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value>
203 where
204 V: Visitor<'de>,
205 {
206 visitor.visit_i64(self.parse_signed()?)
207 }
208
209 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value>
210 where
211 V: Visitor<'de>,
212 {
213 visitor.visit_u8(self.parse_unsigned()?)
214 }
215
216 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value>
217 where
218 V: Visitor<'de>,
219 {
220 visitor.visit_u16(self.parse_unsigned()?)
221 }
222
223 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value>
224 where
225 V: Visitor<'de>,
226 {
227 visitor.visit_u32(self.parse_unsigned()?)
228 }
229
230 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value>
231 where
232 V: Visitor<'de>,
233 {
234 visitor.visit_u64(self.parse_unsigned()?)
235 }
236
237 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value>
238 where
239 V: Visitor<'de>,
240 {
241 visitor.visit_f32(self.parse_float()? as f32)
242 }
243
244 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value>
245 where
246 V: Visitor<'de>,
247 {
248 visitor.visit_f64(self.parse_float()?)
249 }
250
251 fn deserialize_char<V>(self, _visitor: V) -> Result<V::Value>
254 where
255 V: Visitor<'de>,
256 {
257 unimplemented!()
259 }
260
261 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
264 where
265 V: Visitor<'de>,
266 {
267 let str = self.parse_string()?;
268 visitor.visit_str(str.as_str())
269 }
270
271 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
272 where
273 V: Visitor<'de>,
274 {
275 visitor.visit_string(self.parse_string()?)
276 }
277
278 fn deserialize_bytes<V>(self, _visitor: V) -> Result<V::Value>
281 where
282 V: Visitor<'de>,
283 {
284 todo!()
285 }
286
287 fn deserialize_byte_buf<V>(self, _visitor: V) -> Result<V::Value>
288 where
289 V: Visitor<'de>,
290 {
291 todo!()
292 }
294
295 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
304 where
305 V: Visitor<'de>,
306 {
307 let source = self.source();
308 let token = self.peek_token().expect_token(
309 &[
310 Token::Null,
311 Token::Bool,
312 Token::LiteralString,
313 Token::Integer,
314 Token::Float,
315 Token::Array,
316 Token::SquareOpen,
317 ],
318 source,
319 )?;
320 if token.token == Token::Null {
321 let _ = self.next_token();
322 visitor.visit_none()
323 } else {
324 visitor.visit_some(self)
325 }
326 }
327
328 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
329 where
330 V: Visitor<'de>,
331 {
332 self.next_token()
333 .expect_token(&[Token::Null], self.source())?;
334 visitor.visit_unit()
335 }
336
337 fn deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
338 where
339 V: Visitor<'de>,
340 {
341 self.deserialize_unit(visitor)
342 }
343
344 fn deserialize_newtype_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
345 where
346 V: Visitor<'de>,
347 {
348 visitor.visit_newtype_struct(self)
349 }
350
351 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
352 where
353 V: Visitor<'de>,
354 {
355 let token = self
356 .next_token()
357 .expect_token(&[Token::Array, Token::SquareOpen], self.source())?;
358 let syntax = match token.token {
359 Token::Array => {
360 self.next_token()
361 .expect_token(&[Token::BracketOpen], self.source())?;
362 ArraySyntax::Long
363 }
364 Token::SquareOpen => ArraySyntax::Short,
365 _ => unreachable!(),
366 };
367
368 let value = visitor.visit_seq(ArrayWalker::new(self, syntax))?;
369 Ok(value)
370 }
371
372 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value>
373 where
374 V: Visitor<'de>,
375 {
376 self.deserialize_seq(visitor)
377 }
378
379 fn deserialize_tuple_struct<V>(
380 self,
381 _name: &'static str,
382 _len: usize,
383 visitor: V,
384 ) -> Result<V::Value>
385 where
386 V: Visitor<'de>,
387 {
388 self.deserialize_seq(visitor)
389 }
390
391 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
392 where
393 V: Visitor<'de>,
394 {
395 let token = self
396 .next_token()
397 .expect_token(&[Token::Array, Token::SquareOpen], self.source())?;
398 let syntax = match token.token {
399 Token::Array => {
400 self.next_token()
401 .expect_token(&[Token::BracketOpen], self.source())?;
402 ArraySyntax::Long
403 }
404 Token::SquareOpen => ArraySyntax::Short,
405 _ => unreachable!(),
406 };
407
408 let value = visitor.visit_map(ArrayWalker::new(self, syntax))?;
409 Ok(value)
410 }
411
412 fn deserialize_struct<V>(
413 self,
414 _name: &'static str,
415 _fields: &'static [&'static str],
416 visitor: V,
417 ) -> Result<V::Value>
418 where
419 V: Visitor<'de>,
420 {
421 self.deserialize_map(visitor)
422 }
423
424 fn deserialize_enum<V>(
425 self,
426 _name: &'static str,
427 _variants: &'static [&'static str],
428 visitor: V,
429 ) -> Result<V::Value>
430 where
431 V: Visitor<'de>,
432 {
433 let source = self.source();
434 let token = self.peek_token().expect_token(
435 &[Token::LiteralString, Token::Array, Token::SquareOpen],
436 source,
437 )?;
438 match token.token {
439 Token::LiteralString => visitor.visit_enum(self.parse_string()?.into_deserializer()),
440 Token::Array | Token::SquareOpen => {
441 self.eat_token();
442 let syntax = if token.token == Token::Array {
443 self.next_token()
444 .expect_token(&[Token::BracketOpen], self.source())?;
445 ArraySyntax::Long
446 } else {
447 ArraySyntax::Short
448 };
449
450 let value = visitor.visit_enum(Enum::new(self))?;
451 self.next_token()
452 .expect_token(&[syntax.close_bracket()], self.source())?;
453 Ok(value)
454 }
455 _ => unreachable!(),
456 }
457 }
458
459 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
460 where
461 V: Visitor<'de>,
462 {
463 self.deserialize_str(visitor)
464 }
465
466 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
467 where
468 V: Visitor<'de>,
469 {
470 self.deserialize_any(visitor)
471 }
472}
473
474struct ArrayWalker<'source, 'a> {
475 de: &'a mut Deserializer<'source>,
476 next_int_key: i64,
477 syntax: ArraySyntax,
478 done: bool,
479}
480
481impl<'source, 'a> ArrayWalker<'source, 'a> {
482 pub fn new(de: &'a mut Deserializer<'source>, syntax: ArraySyntax) -> Self {
483 ArrayWalker {
484 de,
485 next_int_key: 0,
486 syntax,
487 done: false,
488 }
489 }
490
491 fn source(&self) -> &'source str {
492 self.de.source()
493 }
494}
495
496impl<'de> SeqAccess<'de> for ArrayWalker<'de, '_> {
497 type Error = ParseError;
498
499 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
500 where
501 T: DeserializeSeed<'de>,
502 {
503 let source = self.source();
504 if self.done {
505 return Ok(None);
506 }
507
508 let token = self.de.next_token().expect_token(
509 &[
510 Token::Bool,
511 Token::Integer,
512 Token::Float,
513 Token::LiteralString,
514 Token::Null,
515 Token::Array,
516 Token::SquareOpen,
517 self.syntax.close_bracket(),
518 ],
519 source,
520 )?;
521
522 if token.token == self.syntax.close_bracket() {
523 self.done = true;
524 return Ok(None);
525 }
526
527 let value_token = if token.token.is_valid_array_key() {
528 let next = self.de.peek_token();
529
530 if next.map(|t| t.token) == Some(Token::Arrow) {
531 self.de.eat_token();
532 let key_span = token.span.clone();
533 let key = self.de.parser.parse_array_key(token)?;
534 match key {
535 Key::Int(key) if key == self.next_int_key => Ok(()),
536 Key::Int(_) => Err(ParseError::UnexpectedArrayKey(ArrayKeyError::new(
537 ArrayKeyErrorKind::NonConsecutive,
538 self.source(),
539 key_span,
540 ))),
541 _ => Err(ParseError::UnexpectedArrayKey(ArrayKeyError::new(
542 ArrayKeyErrorKind::IntegerExpected,
543 self.source(),
544 key_span,
545 ))),
546 }?;
547 self.next_int_key += 1;
548 self.de.next_token().expect_token(
549 &[
550 Token::Bool,
551 Token::Integer,
552 Token::Float,
553 Token::LiteralString,
554 Token::Null,
555 Token::Array,
556 Token::SquareOpen,
557 ],
558 self.source(),
559 )?
560 } else {
561 token
562 }
563 } else {
564 token
565 };
566
567 self.de.push_peeked(value_token);
569 let result = seed.deserialize(&mut *self.de).map(Some)?;
570
571 let comma_or_end = self
572 .de
573 .next_token()
574 .expect_token(&[Token::Comma, self.syntax.close_bracket()], source)?;
575 if comma_or_end.token == self.syntax.close_bracket() {
576 self.done = true;
577 }
578
579 Ok(result)
580 }
581}
582
583impl<'de> MapAccess<'de> for ArrayWalker<'de, '_> {
584 type Error = ParseError;
585
586 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
587 where
588 K: DeserializeSeed<'de>,
589 {
590 if self.done {
591 return Ok(None);
592 }
593
594 let token = self.de.next_token().expect_token(
595 &[
596 Token::Bool,
597 Token::Integer,
598 Token::Float,
599 Token::LiteralString,
600 Token::Null,
601 self.syntax.close_bracket(),
602 Token::Array,
604 Token::SquareOpen,
605 ],
606 self.source(),
607 )?;
608
609 if token.token == self.syntax.close_bracket() {
610 self.done = true;
611 return Ok(None);
612 }
613
614 let next = self.de.next_token().ok_or_else(|| {
615 Option::<SpannedToken>::None
616 .expect_token(
617 &[Token::Arrow, Token::Comma, self.syntax.close_bracket()],
618 self.source(),
619 )
620 .unwrap_err()
621 })?;
622
623 match next.token {
624 Token::Arrow => {
625 let token = token.expect_token(
627 &[
628 Token::Bool,
629 Token::Integer,
630 Token::Float,
631 Token::LiteralString,
632 Token::Null,
633 self.syntax.close_bracket(),
634 ],
635 self.source(),
636 )?;
637 if let Key::Int(int_key) = self.de.parser.parse_array_key(token.clone())? {
639 self.next_int_key = int_key + 1;
640 }
641 self.de.push_peeked(token);
642 seed.deserialize(&mut *self.de).map(Some)
643 }
644 _ => {
645 let key = self.next_int_key;
647 self.next_int_key += 1;
648 self.de.push_peeked(next);
649 self.de.push_peeked(token);
650 seed.deserialize(key.to_string().into_deserializer())
651 .map(Some)
652 }
653 }
654 }
655
656 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
657 where
658 V: DeserializeSeed<'de>,
659 {
660 let source = self.source();
661 self.de.peek_token().expect_token(
662 &[
663 Token::Bool,
664 Token::Integer,
665 Token::Float,
666 Token::LiteralString,
667 Token::Null,
668 Token::Array,
669 Token::SquareOpen,
670 ],
671 source,
672 )?;
673
674 let value = seed.deserialize(&mut *self.de)?;
676
677 let next = self
678 .de
679 .next_token()
680 .expect_token(&[Token::Comma, self.syntax.close_bracket()], self.source())?;
681
682 if next.token == self.syntax.close_bracket() {
683 self.done = true;
684 }
685 Ok(value)
686 }
687}
688
689struct Enum<'a, 'de: 'a> {
690 de: &'a mut Deserializer<'de>,
691}
692
693impl<'a, 'de> Enum<'a, 'de> {
694 fn new(de: &'a mut Deserializer<'de>) -> Self {
695 Enum { de }
696 }
697
698 fn source(&self) -> &'de str {
699 self.de.source()
700 }
701}
702
703impl<'de> EnumAccess<'de> for Enum<'_, 'de> {
709 type Error = ParseError;
710 type Variant = Self;
711
712 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant)>
713 where
714 V: DeserializeSeed<'de>,
715 {
716 let val = seed.deserialize(&mut *self.de)?;
717 self.de
718 .next_token()
719 .expect_token(&[Token::Arrow], self.source())?;
720 Ok((val, self))
721 }
722}
723
724impl<'de> VariantAccess<'de> for Enum<'_, 'de> {
727 type Error = ParseError;
728
729 fn unit_variant(self) -> Result<()> {
730 self.de
731 .next_token()
732 .expect_token(&[Token::LiteralString], self.source())?;
733 Ok(())
734 }
735
736 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
737 where
738 T: DeserializeSeed<'de>,
739 {
740 seed.deserialize(self.de)
741 }
742
743 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value>
744 where
745 V: Visitor<'de>,
746 {
747 de::Deserializer::deserialize_seq(self.de, visitor)
748 }
749
750 fn struct_variant<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value>
751 where
752 V: Visitor<'de>,
753 {
754 de::Deserializer::deserialize_map(self.de, visitor)
755 }
756}
757
758#[cfg(test)]
761mod tests {
762 use serde_derive::Deserialize;
763
764 fn from_str<'a, T>(source: &'a str) -> super::Result<T>
765 where
766 T: serde::Deserialize<'a>,
767 {
768 match super::from_str(source) {
769 Ok(res) => Ok(res),
770 Err(err) => {
771 eprintln!("{err}");
772 Err(err)
773 }
774 }
775 }
776
777 #[test]
778 fn test_vec() {
779 let j = r#"["a","b"]"#;
780 let expected: Vec<String> = vec!["a".to_string(), "b".to_string()];
781 assert_eq!(expected, from_str::<Vec<String>>(j).unwrap());
782 }
783
784 #[test]
785 fn test_vec_explicit_keys() {
786 let j = r#"[0=>"a", 1=>"b"]"#;
787 let expected: Vec<String> = vec!["a".to_string(), "b".to_string()];
788 assert_eq!(expected, from_str::<Vec<String>>(j).unwrap());
789 }
790
791 #[test]
792 fn test_struct() {
793 #[derive(Deserialize, PartialEq, Debug)]
794 struct Test {
795 int: u32,
796 seq: Vec<String>,
797 }
798
799 let j = r#"["int"=>1,"seq"=>["a","b"]]"#;
800 let expected = Test {
801 int: 1,
802 seq: vec!["a".to_owned(), "b".to_owned()],
803 };
804 assert_eq!(expected, from_str(j).unwrap());
805 }
806
807 #[test]
808 fn test_struct_nested() {
809 #[derive(Deserialize, PartialEq, Debug)]
810 struct Inner {
811 a: f32,
812 b: bool,
813 }
814
815 #[derive(Deserialize, PartialEq, Debug)]
816 struct Test {
817 int: u32,
818 nested: Inner,
819 }
820
821 let j = r#"["int"=>1,"nested"=>["a" => 1.0, "b" => false]]"#;
822 let expected = Test {
823 int: 1,
824 nested: Inner { a: 1.0, b: false },
825 };
826 assert_eq!(expected, from_str(j).unwrap());
827 }
828
829 #[test]
830 fn test_enum() {
831 #[derive(Deserialize, PartialEq, Debug)]
832 enum E {
833 Unit,
834 Newtype1(u32),
835 Newtype2(u32),
836 Tuple(u32, u32),
837 Struct { a: u32 },
838 }
839
840 let j = r#""Unit""#;
841 let expected = E::Unit;
842 assert_eq!(expected, from_str(j).unwrap());
843
844 let j = r#"["Newtype1"=>1]"#;
845 let expected = E::Newtype1(1);
846 assert_eq!(expected, from_str(j).unwrap());
847
848 let j = r#"["Newtype2"=>1]"#;
849 let expected = E::Newtype2(1);
850 assert_eq!(expected, from_str(j).unwrap());
851
852 let j = r#"["Tuple"=>[1,2]]"#;
853 let expected = E::Tuple(1, 2);
854 assert_eq!(expected, from_str(j).unwrap());
855
856 let j = r#"["Struct"=>["a"=>1]]"#;
857 let expected = E::Struct { a: 1 };
858 assert_eq!(expected, from_str(j).unwrap());
859 }
860}