1use crate::entry::{string_is_array, Entry, ParseItem};
2use crate::error::{ExpectToken, NoValidTokenError, ResultExt, SerdeParseError, UnknownError};
3use crate::tokenizer::{SpannedToken, Tokenizer};
4use crate::{Token, VdfError};
5use logos::Span;
6use serde_core::de::{
7 self, DeserializeSeed, EnumAccess, MapAccess, SeqAccess, VariantAccess, Visitor,
8};
9use serde_core::Deserialize;
10use std::borrow::Cow;
11
12type Result<T, E = VdfError> = std::result::Result<T, E>;
13
14pub struct Deserializer<'de> {
15 tokenizer: Tokenizer<'de>,
16 peeked: Option<Result<SpannedToken, Span>>,
17 last_key: Cow<'de, str>,
18 last_span: Span,
19}
20
21const STRING_ITEMS: &[Token] = &[
22 Token::Item,
23 Token::QuotedItem,
24 Token::Statement,
25 Token::QuotedStatement,
26];
27
28impl<'de> Deserializer<'de> {
29 pub fn from_str(input: &'de str) -> Self {
30 Deserializer {
31 tokenizer: Tokenizer::from_str(input),
32 peeked: None,
33 last_key: "".into(),
34 last_span: 0..0,
35 }
36 }
37
38 pub fn source(&self) -> &'de str {
39 self.tokenizer.source()
40 }
41
42 pub fn next(&mut self) -> Option<Result<SpannedToken, Span>> {
43 self.peeked
44 .take()
45 .or_else(|| self.tokenizer.next())
46 .map(|r| {
47 r.map(|t| {
48 self.last_span = t.span.clone();
49 t
50 })
51 .map_err(|span| {
52 self.last_span = span.clone();
53 span
54 })
55 })
56 }
57
58 pub fn peek(&mut self) -> Option<Result<SpannedToken, Span>> {
59 if self.peeked.is_none() {
60 self.peeked = self.tokenizer.next();
61 }
62 self.peeked.clone()
63 }
64
65 fn peek_span(&mut self) -> Option<Span> {
66 self.peek().and_then(|r| r.ok()).map(|token| token.span)
67 }
68
69 pub fn push_peeked(&mut self, token: SpannedToken) {
70 self.peeked = Some(Ok(token))
71 }
72
73 fn read_str(&mut self) -> Result<(Cow<'de, str>, Span)> {
74 let token = self.next().expect_token(STRING_ITEMS, self.source())?;
75 Ok((token.string(self.source()), token.span))
76 }
77
78 fn parse<T: ParseItem>(&mut self) -> Result<T> {
79 let (str, span) = self.read_str()?;
80 T::from_str(str.as_ref())
81 .map_err(|e| SerdeParseError::new(e.ty, &e.value, span, self.source()).into())
82 }
83
84 fn set_last_key(&mut self, key: Cow<'de, str>) {
85 self.last_key = key;
86 }
87}
88
89pub fn from_str<'a, T>(s: &'a str) -> Result<T>
90where
91 T: Deserialize<'a>,
92{
93 let mut deserializer = Deserializer::from_str(s);
94 T::deserialize(&mut deserializer)
95}
96
97pub fn from_entry<'a, T>(entry: Entry) -> Result<T>
98where
99 T: Deserialize<'a>,
100{
101 T::deserialize(entry)
102}
103
104const VALUE_TOKEN: &[Token] = &[
105 Token::Item,
106 Token::QuotedItem,
107 Token::Statement,
108 Token::QuotedStatement,
109 Token::GroupStart,
110];
111
112impl<'de> de::Deserializer<'de> for &'_ mut Deserializer<'de> {
113 type Error = VdfError;
114
115 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
116 where
117 V: Visitor<'de>,
118 {
119 let source = self.source();
120 let token = self.next().expect_token(VALUE_TOKEN, source)?;
121 let span = token.span.clone();
122 match token.token {
123 Token::Item | Token::QuotedItem | Token::Statement | Token::QuotedStatement => {
124 let str = token.string(self.source());
125 if let Ok(int) = i64::from_str(str.as_ref()) {
127 return visitor.visit_i64(int).ensure_span(span, self.source());
128 }
129 if let Ok(float) = f64::from_str(str.as_ref()) {
130 return visitor.visit_f64(float).ensure_span(span, self.source());
131 }
132 if string_is_array(&str) {
133 self.push_peeked(token);
134 return self
135 .deserialize_seq(visitor)
136 .ensure_span(span, self.source());
137 }
138 match str {
139 Cow::Borrowed(str) => visitor
140 .visit_borrowed_str(str)
141 .ensure_span(span, self.source()),
142 Cow::Owned(str) => visitor.visit_string(str).ensure_span(span, self.source()),
143 }
144 }
145 Token::GroupStart => {
146 let res = visitor.visit_map(TableWalker::new(self, false));
147 let span = span.start..self.last_span.end;
148 res.ensure_span(span.clone(), self.source()).map_err(|e| {
149 if e.span().map(|s| s.offset()) == Some(span.start) {
150 e.with_source_span(span, self.source())
151 } else {
152 e
153 }
154 })
155 }
156 _ => unreachable!(),
157 }
158 }
159
160 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
161 where
162 V: Visitor<'de>,
163 {
164 visitor.visit_bool(self.parse()?)
165 }
166
167 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value>
170 where
171 V: Visitor<'de>,
172 {
173 visitor.visit_i8(self.parse()?)
174 }
175
176 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value>
177 where
178 V: Visitor<'de>,
179 {
180 visitor.visit_i16(self.parse()?)
181 }
182
183 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value>
184 where
185 V: Visitor<'de>,
186 {
187 visitor.visit_i32(self.parse()?)
188 }
189
190 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value>
191 where
192 V: Visitor<'de>,
193 {
194 visitor.visit_i64(self.parse()?)
195 }
196
197 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value>
198 where
199 V: Visitor<'de>,
200 {
201 visitor.visit_u8(self.parse()?)
202 }
203
204 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value>
205 where
206 V: Visitor<'de>,
207 {
208 visitor.visit_u16(self.parse()?)
209 }
210
211 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value>
212 where
213 V: Visitor<'de>,
214 {
215 visitor.visit_u32(self.parse()?)
216 }
217
218 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value>
219 where
220 V: Visitor<'de>,
221 {
222 visitor.visit_u64(self.parse()?)
223 }
224
225 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value>
226 where
227 V: Visitor<'de>,
228 {
229 visitor.visit_f32(self.parse()?)
230 }
231
232 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value>
233 where
234 V: Visitor<'de>,
235 {
236 visitor.visit_f64(self.parse()?)
237 }
238
239 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value>
242 where
243 V: Visitor<'de>,
244 {
245 let (str, span) = self.read_str()?;
246 let mut chars = str.chars();
247 match (chars.next(), chars.next()) {
248 (Some(_), None) => Ok(()),
249 _ => Err(SerdeParseError::new(
250 "char",
251 str.as_ref(),
252 span,
253 self.source(),
254 )),
255 }?;
256
257 visitor.visit_str(str.as_ref())
258 }
259
260 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
263 where
264 V: Visitor<'de>,
265 {
266 visitor.visit_str(self.read_str()?.0.as_ref())
267 }
268
269 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
270 where
271 V: Visitor<'de>,
272 {
273 visitor.visit_string(self.read_str()?.0.into())
274 }
275
276 fn deserialize_bytes<V>(self, _visitor: V) -> Result<V::Value>
279 where
280 V: Visitor<'de>,
281 {
282 todo!()
283 }
284
285 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
286 where
287 V: Visitor<'de>,
288 {
289 visitor.visit_byte_buf(self.read_str()?.0.as_bytes().into())
290 }
291
292 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
301 where
302 V: Visitor<'de>,
303 {
304 let token = match self.next() {
305 None => return visitor.visit_none(),
306 Some(Err(span)) => {
307 return Err(
308 NoValidTokenError::new(VALUE_TOKEN, span.into(), self.source().into()).into(),
309 )
310 }
311 Some(Ok(token)) => token,
312 };
313 if token.span.is_empty() {
314 return visitor.visit_none();
315 }
316 self.push_peeked(token);
317 visitor.visit_some(self)
318 }
319
320 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
321 where
322 V: Visitor<'de>,
323 {
324 let (str, span) = self.read_str()?;
325 if !str.is_empty() {
326 return Err(SerdeParseError::new("unit", str.as_ref(), span, self.source()).into());
327 }
328 visitor.visit_unit()
329 }
330
331 fn deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
332 where
333 V: Visitor<'de>,
334 {
335 let (str, span) = self.read_str()?;
336 if !str.is_empty() {
337 return Err(SerdeParseError::new("unit", str.as_ref(), span, self.source()).into());
338 }
339 visitor.visit_unit()
340 }
341
342 fn deserialize_newtype_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
343 where
344 V: Visitor<'de>,
345 {
346 visitor.visit_newtype_struct(self)
347 }
348
349 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
350 where
351 V: Visitor<'de>,
352 {
353 let token = self.peek().expect_token(SEQ_START_ITEMS, self.source())?;
354
355 if token.token == Token::GroupStart {
356 let _ = self.next();
358 return visitor.visit_seq(MapSeqWalker {
359 table: TableWalker::new(self, false),
360 last_key: None,
361 });
362 }
363
364 let value_str = &self.source()[token.span.clone()];
365 if (value_str.starts_with("\"[") && value_str.ends_with("]\""))
366 || (value_str.starts_with("\"{") && value_str.ends_with("}\""))
367 {
368 let _ = self.next();
369 let seq = &value_str[2..value_str.len() - 2].trim();
370 let span = token.span.start + 2..token.span.end - 2;
371 visitor.visit_seq(StringArrayWalker::new(self.source(), seq, span))
372 } else {
373 let key = self.last_key.clone();
374 visitor.visit_seq(SeqWalker::new(self, key))
375 }
376 }
377
378 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value>
379 where
380 V: Visitor<'de>,
381 {
382 self.deserialize_seq(visitor)
383 }
384
385 fn deserialize_tuple_struct<V>(
386 self,
387 _name: &'static str,
388 _len: usize,
389 visitor: V,
390 ) -> Result<V::Value>
391 where
392 V: Visitor<'de>,
393 {
394 self.deserialize_seq(visitor)
395 }
396
397 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
398 where
399 V: Visitor<'de>,
400 {
401 let toplevel = match self
403 .peek()
404 .expect_token(&[Token::GroupStart], self.source())
405 {
406 Ok(_) => {
407 let _ = self.next();
408 false
409 }
410 Err(VdfError::UnexpectedToken(e)) => {
411 if self.tokenizer.count > 1 {
412 return Err(e.into());
413 }
414 true
415 }
416 Err(e) => {
417 return Err(e);
418 }
419 };
420
421 let value = visitor.visit_map(TableWalker::new(self, toplevel))?;
422 Ok(value)
423 }
424
425 fn deserialize_struct<V>(
426 self,
427 _name: &'static str,
428 _fields: &'static [&'static str],
429 visitor: V,
430 ) -> Result<V::Value>
431 where
432 V: Visitor<'de>,
433 {
434 self.deserialize_map(visitor)
435 }
436
437 fn deserialize_enum<V>(
438 self,
439 _name: &'static str,
440 _variants: &'static [&'static str],
441 visitor: V,
442 ) -> Result<V::Value>
443 where
444 V: Visitor<'de>,
445 {
446 let variant_token = self.peek().and_then(|r| r.ok());
447 visitor
448 .visit_enum(Enum::new(self))
449 .map_err(|e| match (variant_token, &e) {
450 (Some(variant_token), VdfError::UnknownVariant(_)) => {
451 e.with_source_span(variant_token.span.start..self.last_span.end, self.source())
452 }
453 _ => e,
454 })
455 }
456
457 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
458 where
459 V: Visitor<'de>,
460 {
461 self.deserialize_str(visitor)
462 }
463
464 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
465 where
466 V: Visitor<'de>,
467 {
468 self.deserialize_any(visitor)
469 }
470}
471
472struct TableWalker<'source, 'a> {
473 de: &'a mut Deserializer<'source>,
474 done: bool,
475 toplevel: bool,
476}
477
478const KEY_TOKEN: &[Token] = &[
479 Token::Item,
480 Token::QuotedItem,
481 Token::Statement,
482 Token::QuotedStatement,
483 Token::GroupEnd,
484];
485
486impl<'source, 'a> TableWalker<'source, 'a> {
487 pub fn new(de: &'a mut Deserializer<'source>, toplevel: bool) -> Self {
488 TableWalker {
489 de,
490 done: false,
491 toplevel,
492 }
493 }
494
495 fn source(&self) -> &'source str {
496 self.de.source()
497 }
498
499 fn key_token(&mut self, retain_group_end: bool) -> Result<Option<SpannedToken>> {
500 if self.done {
501 return Ok(None);
502 }
503
504 let expected = if self.toplevel {
505 STRING_ITEMS
506 } else {
507 KEY_TOKEN
508 };
509
510 let token = match (self.de.next(), self.toplevel) {
511 (Some(token), _) => token,
512 (None, true) => {
513 self.done = true;
514 return Ok(None);
515 }
516 (None, false) => {
517 return Err(None::<SpannedToken>
518 .expect_token(expected, self.source())
519 .unwrap_err())
520 }
521 };
522
523 let key = token.expect_token(expected, self.source())?;
524
525 if key.token == Token::GroupEnd {
526 self.done = true;
527 if retain_group_end {
528 self.de.push_peeked(key);
529 }
530 return Ok(None);
531 }
532 Ok(Some(key))
533 }
534}
535
536impl<'de> MapAccess<'de> for TableWalker<'de, '_> {
537 type Error = VdfError;
538
539 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
540 where
541 K: DeserializeSeed<'de>,
542 {
543 let key = match self.key_token(false) {
544 Ok(Some(key)) => key,
545 Ok(None) => {
546 return Ok(None);
547 }
548 Err(e) => return Err(e),
549 };
550
551 self.de.set_last_key(key.string(self.source()));
552 self.de.push_peeked(key);
553 seed.deserialize(&mut *self.de).map(Some)
554 }
555
556 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
557 where
558 V: DeserializeSeed<'de>,
559 {
560 if let Some(start_span) = self.de.peek_span() {
561 let res = seed.deserialize(&mut *self.de);
562 let span = start_span.start..self.de.last_span.end;
563 res.ensure_span(span, self.source())
564 } else {
565 seed.deserialize(&mut *self.de)
566 }
567 }
568}
569
570const SEQ_START_ITEMS: &[Token] = &[
572 Token::Item,
573 Token::QuotedItem,
574 Token::Statement,
575 Token::QuotedStatement,
576 Token::GroupStart,
577];
578
579struct SeqWalker<'source, 'a> {
580 table: TableWalker<'source, 'a>,
581 key: Cow<'source, str>,
582 done: bool,
583}
584
585impl<'source, 'a> SeqWalker<'source, 'a> {
586 pub fn new(de: &'a mut Deserializer<'source>, key: Cow<'source, str>) -> Self {
587 SeqWalker {
588 done: false,
589 key,
590 table: TableWalker::new(de, false),
591 }
592 }
593
594 fn source(&self) -> &'source str {
595 self.table.source()
596 }
597}
598
599impl<'de> SeqAccess<'de> for SeqWalker<'de, '_> {
600 type Error = VdfError;
601
602 fn next_element_seed<T>(
603 &mut self,
604 seed: T,
605 ) -> std::result::Result<Option<T::Value>, Self::Error>
606 where
607 T: DeserializeSeed<'de>,
608 {
609 if self.done {
610 return Ok(None);
611 }
612
613 let value = match seed.deserialize(&mut *self.table.de) {
614 Ok(value) => Some(value),
615 Err(VdfError::NoValidToken(_)) => None,
616 Err(e) => return Err(e),
617 };
618
619 let value_span = self.table.de.last_span.clone();
620 let newline = match self.table.de.peek_span() {
621 Some(next_span) => {
622 let whitespace = &self.source()[value_span.end..next_span.start];
623 whitespace.contains('\n')
624 }
625 _ => false,
626 };
627
628 if newline {
629 let key_token = match self.table.key_token(true) {
630 Ok(Some(key)) => key,
631 Ok(None) => {
632 self.done = true;
633 return Ok(value);
634 }
635 Err(e) => return Err(e),
636 };
637
638 let key = key_token.string(self.source());
639 if key != self.key {
640 self.table.de.push_peeked(key_token);
641 self.done = true;
642 }
643 }
644
645 Ok(value)
646 }
647}
648
649struct StringArrayWalker<'source> {
650 source: &'source str,
651 remaining: &'source str,
652 span: Span,
653}
654
655impl<'source> StringArrayWalker<'source> {
656 fn new(source: &'source str, array: &'source str, span: Span) -> Self {
657 StringArrayWalker {
658 source,
659 remaining: array,
660 span,
661 }
662 }
663}
664
665impl<'de, 'source> SeqAccess<'de> for StringArrayWalker<'source>
666where
667 'source: 'de,
668{
669 type Error = VdfError;
670
671 fn next_element_seed<T>(
672 &mut self,
673 seed: T,
674 ) -> std::result::Result<Option<T::Value>, Self::Error>
675 where
676 T: DeserializeSeed<'de>,
677 {
678 if self.remaining.is_empty() {
679 return Ok(None);
680 }
681
682 let (item, rest) = self
683 .remaining
684 .split_once(' ')
685 .unwrap_or((self.remaining, ""));
686 let item_span = self.span.start..(self.span.start + item.len());
687 self.remaining = rest.trim();
688 self.span = (self.span.end - self.remaining.len())..self.span.end;
689
690 let mut de = Deserializer::from_str(item);
691 let val = seed
692 .deserialize(&mut de)
693 .map_err(|e| e.with_source_span(item_span, self.source))?;
694 Ok(Some(val))
695 }
696}
697
698struct MapSeqWalker<'source, 'a> {
699 table: TableWalker<'source, 'a>,
700 last_key: Option<u64>,
701}
702
703impl<'de> SeqAccess<'de> for MapSeqWalker<'de, '_> {
704 type Error = VdfError;
705
706 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
707 where
708 T: DeserializeSeed<'de>,
709 {
710 let Some(key) = self.table.next_key()? else {
711 return Ok(None);
712 };
713 if let Some(last_key) = self.last_key {
714 let expected_key = last_key + 1;
715 if expected_key != key {
716 return Err(VdfError::Other(UnknownError::from(format!(
717 "Invalid array key {key}, expected {expected_key}"
718 )))
719 .with_source_span(self.table.de.last_span.clone(), self.table.de.source()));
720 }
721 }
722
723 self.last_key = Some(key);
724
725 Ok(Some(self.table.next_value_seed(seed)?))
726 }
727}
728
729struct Enum<'a, 'de: 'a> {
730 de: &'a mut Deserializer<'de>,
731 enclosed: bool,
732}
733
734impl<'a, 'de> Enum<'a, 'de> {
735 fn new(de: &'a mut Deserializer<'de>) -> Self {
736 Enum {
737 de,
738 enclosed: false,
739 }
740 }
741}
742
743impl<'de> EnumAccess<'de> for Enum<'_, 'de> {
749 type Error = VdfError;
750 type Variant = Self;
751
752 fn variant_seed<V>(mut self, seed: V) -> Result<(V::Value, Self::Variant)>
753 where
754 V: DeserializeSeed<'de>,
755 {
756 if self
757 .de
758 .peek()
759 .expect_token(&[Token::GroupStart], self.de.source())
760 .is_ok()
761 {
762 self.enclosed = true;
763 let _ = self.de.next();
764 }
765 let val = seed.deserialize(&mut *self.de)?;
766 Ok((val, self))
767 }
768}
769
770impl<'de> VariantAccess<'de> for Enum<'_, 'de> {
773 type Error = VdfError;
774
775 fn unit_variant(self) -> Result<()> {
776 Ok(())
777 }
778
779 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
780 where
781 T: DeserializeSeed<'de>,
782 {
783 let val = seed.deserialize(&mut *self.de)?;
784 if self.enclosed {
785 self.de
786 .next()
787 .expect_token(&[Token::GroupEnd], self.de.source())?;
788 }
789 Ok(val)
790 }
791
792 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value>
793 where
794 V: Visitor<'de>,
795 {
796 let val = de::Deserializer::deserialize_seq(&mut *self.de, visitor)?;
797 if self.enclosed {
798 self.de
799 .next()
800 .expect_token(&[Token::GroupEnd], self.de.source())?;
801 }
802 Ok(val)
803 }
804
805 fn struct_variant<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value>
806 where
807 V: Visitor<'de>,
808 {
809 let val = de::Deserializer::deserialize_map(&mut *self.de, visitor)?;
810 if self.enclosed {
811 self.de
812 .next()
813 .expect_token(&[Token::GroupEnd], self.de.source())?;
814 }
815 Ok(val)
816 }
817}
818
819#[cfg(test)]
822mod tests {
823 use crate::VdfError;
824 use serde::Deserialize;
825
826 fn unwrap_err<T>(r: Result<T, VdfError>) -> T {
827 r.map_err(miette::Error::from).unwrap()
828 }
829
830 fn from_str<'a, T>(source: &'a str) -> super::Result<T>
831 where
832 T: serde::Deserialize<'a>,
833 {
834 match super::from_str(source) {
835 Ok(res) => Ok(res),
836 Err(err) => {
837 eprintln!("{}", err);
838 Err(err)
839 }
840 }
841 }
842
843 #[test]
844 fn test_struct() {
845 #[derive(Deserialize, PartialEq, Debug)]
846 struct Test {
847 int: u32,
848 seq: String,
849 }
850
851 let j = r#"{"int" 1 "seq" "b"}"#;
852 let expected = Test {
853 int: 1,
854 seq: "b".into(),
855 };
856 assert_eq!(expected, unwrap_err(from_str(j)));
857 }
858
859 #[test]
860 fn test_struct_toplevel() {
861 #[derive(Deserialize, PartialEq, Debug)]
862 struct Test {
863 int: u32,
864 seq: String,
865 }
866
867 let j = r#""int" 1 "seq" "b""#;
868 let expected = Test {
869 int: 1,
870 seq: "b".into(),
871 };
872 assert_eq!(expected, unwrap_err(from_str(j)));
873 }
874
875 #[test]
876 fn test_struct_nested() {
877 #[derive(Deserialize, PartialEq, Debug)]
878 struct Inner {
879 a: f32,
880 b: bool,
881 }
882
883 #[derive(Deserialize, PartialEq, Debug)]
884 struct Test {
885 int: u32,
886 nested: Inner,
887 }
888
889 let j = r#"{"int" 1 "nested" {"a" 1.0 "b" false}}"#;
890 let expected = Test {
891 int: 1,
892 nested: Inner { a: 1.0, b: false },
893 };
894 assert_eq!(expected, unwrap_err(from_str(j)));
895 }
896
897 #[test]
898 fn test_enum() {
899 #[derive(Deserialize, PartialEq, Debug)]
900 enum E {
901 Unit,
902 Newtype1(u32),
903 Newtype2(u32),
904 Struct { a: u32 },
905 Struct2 { a: u32 },
906 }
907
908 let j = r#""Unit" """#;
909 let expected = E::Unit;
910 assert_eq!(expected, unwrap_err(from_str(j)));
911
912 let j = r#""Newtype1" 1"#;
913 let expected = E::Newtype1(1);
914 assert_eq!(expected, unwrap_err(from_str(j)));
915
916 let j = r#"Newtype2 1"#;
917 let expected = E::Newtype2(1);
918 assert_eq!(expected, unwrap_err(from_str(j)));
919
920 let j = r#"Struct {"a" 1}"#;
921 let expected = E::Struct { a: 1 };
922 assert_eq!(expected, unwrap_err(from_str(j)));
923
924 let j = r#"Struct2 {"a" 1}"#;
925 let expected = E::Struct2 { a: 1 };
926 assert_eq!(expected, unwrap_err(from_str(j)));
927 }
928
929 #[test]
930 fn test_untagged_enum() {
931 #[derive(Deserialize, PartialEq, Debug)]
932 #[serde(untagged)]
933 enum E {
934 Int(u8),
935 Float(f32),
936 }
937
938 let j = r#"1.1"#;
939 assert_eq!(E::Float(1.1), unwrap_err(from_str(j)));
940 }
941
942 #[test]
943 fn test_list_in_struct() {
944 #[derive(Deserialize, PartialEq, Debug)]
945 struct Test {
946 seq: Vec<u8>,
947 }
948
949 let j = r#"{
950 seq 1
951 seq 2
952 seq 3
953 }"#;
954 let expected = Test { seq: vec![1, 2, 3] };
955 assert_eq!(expected, unwrap_err(from_str(j)));
956
957 let j = r#"{
958 seq 1 2 3
959 }"#;
960 assert_eq!(expected, unwrap_err(from_str(j)));
961 }
962}