1use std::ops::{AddAssign, MulAssign, Neg};
2
3use serde::de::{self, DeserializeSeed, MapAccess, SeqAccess, Visitor};
4use serde::Deserialize;
5
6use crate::error::{Error, Result};
7use std::str::FromStr;
8
9pub struct Deserializer<'de> {
10 input: &'de str,
11}
12
13impl<'de> Deserializer<'de> {
14 #[allow(clippy::should_implement_trait)]
15 pub fn from_str(input: &'de str) -> Self {
16 Deserializer { input }
17 }
18}
19
20pub fn from_str<'a, T>(s: &'a str) -> Result<T>
21where
22 T: Deserialize<'a>,
23{
24 let mut de = Deserializer::from_str(s);
25 let mut deserializer = TopDeserializer::new(&mut de);
26 let t = T::deserialize(&mut deserializer)?;
27 if de.input.is_empty() {
28 Ok(t)
29 } else {
30 println!("{}", &de.input);
31 Err(Error::TrailingCharacters)
32 }
33}
34
35impl<'de> Deserializer<'de> {
36 fn parse_line(&mut self) -> Result<&'de str> {
37 match self.input.find('\n') {
38 Some(len) => {
39 let s = &self.input[..len];
40 self.input = &self.input[len + 1..];
41 Ok(s)
42 }
43 None => {
44 if self.input.is_empty() {
45 Err(Error::Eof)
46 } else {
47 let s = self.input;
48 self.input = "";
49 Ok(s)
50 }
51 }
52 }
53 }
54
55 fn peek_delimiter(&mut self) -> bool {
56 match self.input.find('\n') {
57 Some(len) => len == 0,
58 None => self.input.is_empty(),
59 }
60 }
61
62 fn parse_field_name(&mut self) -> Result<&'de str> {
63 let line = self.parse_line()?;
64 if line.starts_with('%') && line.ends_with('%') {
65 Ok(&line[1..line.len() - 1])
66 } else {
67 Err(Error::FieldNameUnexpectedWrapper(String::from(line)))
68 }
69 }
70
71 fn parse_string(&mut self) -> Result<&'de str> {
72 let line = self.parse_line()?;
73 if line.is_empty() {
74 Err(Error::DelimiterNotExpected)
75 } else {
76 Ok(line)
77 }
78 }
79
80 fn parse_char(&mut self) -> Result<char> {
81 let line = self.parse_line()?;
82 if line.is_empty() {
83 Err(Error::DelimiterNotExpected)
84 } else if line.len() != 1 {
85 Err(Error::CharOverflow)
86 } else {
87 Ok(line.chars().next().unwrap())
88 }
89 }
90
91 fn parse_delimiter(&mut self) -> Result<()> {
92 match self.input.find('\n') {
93 Some(len) => {
94 let s = &self.input[..len];
95 self.input = &self.input[len + 1..];
96 if s.is_empty() {
97 Ok(())
98 } else {
99 Err(Error::DelimiterExpected)
100 }
101 }
102 None => Ok(()),
103 }
104 }
105
106 fn parse_unsigned<T>(&mut self) -> Result<T>
107 where
108 T: AddAssign<T> + MulAssign<T> + FromStr,
109 {
110 let line = self.parse_line()?;
111 match line.parse() {
112 Ok(n) => Ok(n),
113 Err(_) => Err(Error::IntegerError),
114 }
115 }
116
117 fn parse_signed<T>(&mut self) -> Result<T>
118 where
119 T: Neg<Output = T> + AddAssign<T> + MulAssign<T> + FromStr,
120 {
121 let line = self.parse_line()?;
122 match line.parse() {
123 Ok(n) => Ok(n),
124 Err(_) => Err(Error::IntegerError),
125 }
126 }
127}
128
129impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
130 type Error = Error;
131
132 fn deserialize_any<V>(self, _: V) -> Result<V::Value>
133 where
134 V: Visitor<'de>,
135 {
136 Err(Error::NotSupported)
137 }
138
139 fn deserialize_bool<V>(self, _: V) -> Result<V::Value>
140 where
141 V: Visitor<'de>,
142 {
143 Err(Error::NotSupported)
144 }
145
146 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value>
147 where
148 V: Visitor<'de>,
149 {
150 visitor.visit_i8(self.parse_signed()?)
151 }
152
153 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value>
154 where
155 V: Visitor<'de>,
156 {
157 visitor.visit_i16(self.parse_signed()?)
158 }
159
160 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value>
161 where
162 V: Visitor<'de>,
163 {
164 visitor.visit_i32(self.parse_signed()?)
165 }
166
167 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value>
168 where
169 V: Visitor<'de>,
170 {
171 visitor.visit_i64(self.parse_signed()?)
172 }
173
174 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value>
175 where
176 V: Visitor<'de>,
177 {
178 visitor.visit_u8(self.parse_unsigned()?)
179 }
180
181 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value>
182 where
183 V: Visitor<'de>,
184 {
185 visitor.visit_u16(self.parse_unsigned()?)
186 }
187
188 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value>
189 where
190 V: Visitor<'de>,
191 {
192 visitor.visit_u32(self.parse_unsigned()?)
193 }
194
195 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value>
196 where
197 V: Visitor<'de>,
198 {
199 visitor.visit_u64(self.parse_unsigned()?)
200 }
201
202 fn deserialize_f32<V>(self, _visitor: V) -> Result<V::Value>
203 where
204 V: Visitor<'de>,
205 {
206 Err(Error::NotSupported)
207 }
208
209 fn deserialize_f64<V>(self, _visitor: V) -> Result<V::Value>
210 where
211 V: Visitor<'de>,
212 {
213 Err(Error::NotSupported)
214 }
215
216 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value>
217 where
218 V: Visitor<'de>,
219 {
220 visitor.visit_char(self.parse_char()?)
221 }
222
223 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
224 where
225 V: Visitor<'de>,
226 {
227 visitor.visit_borrowed_str(self.parse_string()?)
228 }
229
230 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
231 where
232 V: Visitor<'de>,
233 {
234 self.deserialize_str(visitor)
235 }
236
237 fn deserialize_bytes<V>(self, _visitor: V) -> Result<V::Value>
240 where
241 V: Visitor<'de>,
242 {
243 Err(Error::NotSupported)
244 }
245
246 fn deserialize_byte_buf<V>(self, _visitor: V) -> Result<V::Value>
247 where
248 V: Visitor<'de>,
249 {
250 Err(Error::NotSupported)
251 }
252
253 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
254 where
255 V: Visitor<'de>,
256 {
257 if self.peek_delimiter() {
258 self.parse_delimiter()?;
259 visitor.visit_none()
260 } else {
261 visitor.visit_some(self)
262 }
263 }
264
265 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
266 where
267 V: Visitor<'de>,
268 {
269 if self.peek_delimiter() {
270 self.parse_delimiter()?;
271 visitor.visit_unit()
272 } else {
273 Err(Error::DelimiterExpected)
274 }
275 }
276
277 fn deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
278 where
279 V: Visitor<'de>,
280 {
281 self.deserialize_unit(visitor)
282 }
283
284 fn deserialize_newtype_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
285 where
286 V: Visitor<'de>,
287 {
288 visitor.visit_newtype_struct(self)
289 }
290
291 fn deserialize_seq<V>(mut self, visitor: V) -> Result<V::Value>
292 where
293 V: Visitor<'de>,
294 {
295 let value = visitor.visit_seq(NewlineSeparated::new(&mut self))?;
296 Ok(value)
297 }
298
299 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value>
300 where
301 V: Visitor<'de>,
302 {
303 self.deserialize_seq(visitor)
304 }
305
306 fn deserialize_tuple_struct<V>(
307 self,
308 _name: &'static str,
309 _len: usize,
310 visitor: V,
311 ) -> Result<V::Value>
312 where
313 V: Visitor<'de>,
314 {
315 self.deserialize_seq(visitor)
316 }
317
318 fn deserialize_map<V>(mut self, visitor: V) -> Result<V::Value>
319 where
320 V: Visitor<'de>,
321 {
322 let value = visitor.visit_map(NewlineSeparated::new(&mut self))?;
323 Ok(value)
324 }
325
326 fn deserialize_struct<V>(
327 self,
328 _name: &'static str,
329 _fields: &'static [&'static str],
330 visitor: V,
331 ) -> Result<V::Value>
332 where
333 V: Visitor<'de>,
334 {
335 self.deserialize_map(visitor)
336 }
337
338 fn deserialize_enum<V>(
339 self,
340 _name: &'static str,
341 _variants: &'static [&'static str],
342 _visitor: V,
343 ) -> Result<V::Value>
344 where
345 V: Visitor<'de>,
346 {
347 Err(Error::NotSupported)
349 }
350
351 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
352 where
353 V: Visitor<'de>,
354 {
355 visitor.visit_borrowed_str(self.parse_field_name()?)
356 }
357
358 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
359 where
360 V: Visitor<'de>,
361 {
362 self.deserialize_any(visitor)
363 }
364}
365
366struct TopDeserializer<'a, 'de: 'a> {
367 de: &'a mut Deserializer<'de>,
368}
369
370impl<'a, 'de> TopDeserializer<'a, 'de> {
371 fn new(de: &'a mut Deserializer<'de>) -> Self {
372 TopDeserializer { de }
373 }
374}
375
376impl<'de, 'a> de::Deserializer<'de> for &'a mut TopDeserializer<'a, 'de> {
377 type Error = Error;
378
379 fn deserialize_any<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value>
380 where
381 V: Visitor<'de>,
382 {
383 Err(Error::NotSupported)
384 }
385
386 fn deserialize_bool<V>(self, _visitor: V) -> Result<<V as Visitor<'de>>::Value>
387 where
388 V: Visitor<'de>,
389 {
390 Err(Error::StructExpected)
391 }
392
393 fn deserialize_i8<V>(self, _visitor: V) -> Result<<V as Visitor<'de>>::Value>
394 where
395 V: Visitor<'de>,
396 {
397 Err(Error::StructExpected)
398 }
399
400 fn deserialize_i16<V>(self, _visitor: V) -> Result<<V as Visitor<'de>>::Value>
401 where
402 V: Visitor<'de>,
403 {
404 Err(Error::StructExpected)
405 }
406
407 fn deserialize_i32<V>(self, _visitor: V) -> Result<<V as Visitor<'de>>::Value>
408 where
409 V: Visitor<'de>,
410 {
411 Err(Error::StructExpected)
412 }
413
414 fn deserialize_i64<V>(self, _visitor: V) -> Result<<V as Visitor<'de>>::Value>
415 where
416 V: Visitor<'de>,
417 {
418 Err(Error::StructExpected)
419 }
420
421 fn deserialize_u8<V>(self, _visitor: V) -> Result<<V as Visitor<'de>>::Value>
422 where
423 V: Visitor<'de>,
424 {
425 Err(Error::StructExpected)
426 }
427
428 fn deserialize_u16<V>(self, _visitor: V) -> Result<<V as Visitor<'de>>::Value>
429 where
430 V: Visitor<'de>,
431 {
432 Err(Error::StructExpected)
433 }
434
435 fn deserialize_u32<V>(self, _visitor: V) -> Result<<V as Visitor<'de>>::Value>
436 where
437 V: Visitor<'de>,
438 {
439 Err(Error::StructExpected)
440 }
441
442 fn deserialize_u64<V>(self, _visitor: V) -> Result<<V as Visitor<'de>>::Value>
443 where
444 V: Visitor<'de>,
445 {
446 Err(Error::StructExpected)
447 }
448
449 fn deserialize_f32<V>(self, _visitor: V) -> Result<<V as Visitor<'de>>::Value>
450 where
451 V: Visitor<'de>,
452 {
453 Err(Error::StructExpected)
454 }
455
456 fn deserialize_f64<V>(self, _visitor: V) -> Result<<V as Visitor<'de>>::Value>
457 where
458 V: Visitor<'de>,
459 {
460 Err(Error::StructExpected)
461 }
462
463 fn deserialize_char<V>(self, _visitor: V) -> Result<<V as Visitor<'de>>::Value>
464 where
465 V: Visitor<'de>,
466 {
467 Err(Error::StructExpected)
468 }
469
470 fn deserialize_str<V>(self, _visitor: V) -> Result<<V as Visitor<'de>>::Value>
471 where
472 V: Visitor<'de>,
473 {
474 Err(Error::StructExpected)
475 }
476
477 fn deserialize_string<V>(self, _visitor: V) -> Result<<V as Visitor<'de>>::Value>
478 where
479 V: Visitor<'de>,
480 {
481 Err(Error::StructExpected)
482 }
483
484 fn deserialize_bytes<V>(self, _visitor: V) -> Result<<V as Visitor<'de>>::Value>
485 where
486 V: Visitor<'de>,
487 {
488 Err(Error::StructExpected)
489 }
490
491 fn deserialize_byte_buf<V>(self, _visitor: V) -> Result<<V as Visitor<'de>>::Value>
492 where
493 V: Visitor<'de>,
494 {
495 Err(Error::StructExpected)
496 }
497
498 fn deserialize_option<V>(self, _visitor: V) -> Result<<V as Visitor<'de>>::Value>
499 where
500 V: Visitor<'de>,
501 {
502 Err(Error::StructExpected)
503 }
504
505 fn deserialize_unit<V>(self, _visitor: V) -> Result<<V as Visitor<'de>>::Value>
506 where
507 V: Visitor<'de>,
508 {
509 Err(Error::StructExpected)
510 }
511
512 fn deserialize_unit_struct<V>(
513 self,
514 _name: &'static str,
515 _visitor: V,
516 ) -> Result<<V as Visitor<'de>>::Value>
517 where
518 V: Visitor<'de>,
519 {
520 Err(Error::StructExpected)
521 }
522
523 fn deserialize_newtype_struct<V>(
524 self,
525 _name: &'static str,
526 _visitor: V,
527 ) -> Result<<V as Visitor<'de>>::Value>
528 where
529 V: Visitor<'de>,
530 {
531 Err(Error::StructExpected)
532 }
533
534 fn deserialize_seq<V>(self, _visitor: V) -> Result<<V as Visitor<'de>>::Value>
535 where
536 V: Visitor<'de>,
537 {
538 Err(Error::StructExpected)
539 }
540
541 fn deserialize_tuple<V>(self, _len: usize, _visitor: V) -> Result<<V as Visitor<'de>>::Value>
542 where
543 V: Visitor<'de>,
544 {
545 Err(Error::StructExpected)
546 }
547
548 fn deserialize_tuple_struct<V>(
549 self,
550 _name: &'static str,
551 _len: usize,
552 _visitor: V,
553 ) -> Result<<V as Visitor<'de>>::Value>
554 where
555 V: Visitor<'de>,
556 {
557 Err(Error::StructExpected)
558 }
559
560 fn deserialize_map<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
561 where
562 V: Visitor<'de>,
563 {
564 self.de.deserialize_map(visitor)
565 }
566
567 fn deserialize_struct<V>(
568 self,
569 name: &'static str,
570 fields: &'static [&'static str],
571 visitor: V,
572 ) -> Result<<V as Visitor<'de>>::Value>
573 where
574 V: Visitor<'de>,
575 {
576 self.de.deserialize_struct(name, fields, visitor)
577 }
578
579 fn deserialize_enum<V>(
580 self,
581 _name: &'static str,
582 _variants: &'static [&'static str],
583 _visitor: V,
584 ) -> Result<<V as Visitor<'de>>::Value>
585 where
586 V: Visitor<'de>,
587 {
588 Err(Error::StructExpected)
589 }
590
591 fn deserialize_identifier<V>(self, _visitor: V) -> Result<<V as Visitor<'de>>::Value>
592 where
593 V: Visitor<'de>,
594 {
595 Err(Error::StructExpected)
596 }
597
598 fn deserialize_ignored_any<V>(self, _visitor: V) -> Result<<V as Visitor<'de>>::Value>
599 where
600 V: Visitor<'de>,
601 {
602 Err(Error::NotSupported)
603 }
604}
605
606struct ValueDeserializer<'a, 'de: 'a> {
607 de: &'a mut Deserializer<'de>,
608 allow_arrays: bool,
609}
610
611impl<'a, 'de> ValueDeserializer<'a, 'de> {
612 fn new(de: &'a mut Deserializer<'de>, allow_arrays: bool) -> Self {
613 ValueDeserializer { de, allow_arrays }
614 }
615}
616
617impl<'de, 'a> de::Deserializer<'de> for &'a mut ValueDeserializer<'a, 'de> {
618 type Error = Error;
619
620 fn deserialize_any<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
621 where
622 V: Visitor<'de>,
623 {
624 self.de.deserialize_any(visitor)
625 }
626
627 fn deserialize_bool<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
628 where
629 V: Visitor<'de>,
630 {
631 self.de.deserialize_bool(visitor)
632 }
633
634 fn deserialize_i8<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
635 where
636 V: Visitor<'de>,
637 {
638 self.de.deserialize_i8(visitor)
639 }
640
641 fn deserialize_i16<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
642 where
643 V: Visitor<'de>,
644 {
645 self.de.deserialize_i16(visitor)
646 }
647
648 fn deserialize_i32<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
649 where
650 V: Visitor<'de>,
651 {
652 self.de.deserialize_i32(visitor)
653 }
654
655 fn deserialize_i64<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
656 where
657 V: Visitor<'de>,
658 {
659 self.de.deserialize_i64(visitor)
660 }
661
662 fn deserialize_u8<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
663 where
664 V: Visitor<'de>,
665 {
666 self.de.deserialize_u8(visitor)
667 }
668
669 fn deserialize_u16<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
670 where
671 V: Visitor<'de>,
672 {
673 self.de.deserialize_u16(visitor)
674 }
675
676 fn deserialize_u32<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
677 where
678 V: Visitor<'de>,
679 {
680 self.de.deserialize_u32(visitor)
681 }
682
683 fn deserialize_u64<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
684 where
685 V: Visitor<'de>,
686 {
687 self.de.deserialize_u64(visitor)
688 }
689
690 fn deserialize_f32<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
691 where
692 V: Visitor<'de>,
693 {
694 self.de.deserialize_f32(visitor)
695 }
696
697 fn deserialize_f64<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
698 where
699 V: Visitor<'de>,
700 {
701 self.de.deserialize_f64(visitor)
702 }
703
704 fn deserialize_char<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
705 where
706 V: Visitor<'de>,
707 {
708 self.de.deserialize_char(visitor)
709 }
710
711 fn deserialize_str<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
712 where
713 V: Visitor<'de>,
714 {
715 self.de.deserialize_str(visitor)
716 }
717
718 fn deserialize_string<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
719 where
720 V: Visitor<'de>,
721 {
722 self.de.deserialize_string(visitor)
723 }
724
725 fn deserialize_bytes<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
726 where
727 V: Visitor<'de>,
728 {
729 self.de.deserialize_bytes(visitor)
730 }
731
732 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
733 where
734 V: Visitor<'de>,
735 {
736 self.de.deserialize_byte_buf(visitor)
737 }
738
739 fn deserialize_option<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
740 where
741 V: Visitor<'de>,
742 {
743 self.de.deserialize_option(visitor)
744 }
745
746 fn deserialize_unit<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
747 where
748 V: Visitor<'de>,
749 {
750 self.de.deserialize_unit(visitor)
751 }
752
753 fn deserialize_unit_struct<V>(
754 self,
755 name: &'static str,
756 visitor: V,
757 ) -> Result<<V as Visitor<'de>>::Value>
758 where
759 V: Visitor<'de>,
760 {
761 self.de.deserialize_unit_struct(name, visitor)
762 }
763
764 fn deserialize_newtype_struct<V>(
765 self,
766 name: &'static str,
767 visitor: V,
768 ) -> Result<<V as Visitor<'de>>::Value>
769 where
770 V: Visitor<'de>,
771 {
772 self.de.deserialize_newtype_struct(name, visitor)
773 }
774
775 fn deserialize_seq<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
776 where
777 V: Visitor<'de>,
778 {
779 if self.allow_arrays {
780 self.de.deserialize_seq(visitor)
781 } else {
782 Err(Error::NotSupported)
783 }
784 }
785
786 fn deserialize_tuple<V>(self, size: usize, visitor: V) -> Result<<V as Visitor<'de>>::Value>
787 where
788 V: Visitor<'de>,
789 {
790 if self.allow_arrays {
791 self.de.deserialize_tuple(size, visitor)
792 } else {
793 Err(Error::NotSupported)
794 }
795 }
796
797 fn deserialize_tuple_struct<V>(
798 self,
799 name: &'static str,
800 size: usize,
801 visitor: V,
802 ) -> Result<<V as Visitor<'de>>::Value>
803 where
804 V: Visitor<'de>,
805 {
806 if self.allow_arrays {
807 self.de.deserialize_tuple_struct(name, size, visitor)
808 } else {
809 Err(Error::NotSupported)
810 }
811 }
812
813 fn deserialize_map<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value>
814 where
815 V: Visitor<'de>,
816 {
817 Err(Error::NotSupported)
818 }
819
820 fn deserialize_struct<V>(
821 self,
822 _: &'static str,
823 _: &'static [&'static str],
824 _: V,
825 ) -> Result<<V as Visitor<'de>>::Value>
826 where
827 V: Visitor<'de>,
828 {
829 Err(Error::NotSupported)
830 }
831
832 fn deserialize_enum<V>(
833 self,
834 _: &'static str,
835 _: &'static [&'static str],
836 _: V,
837 ) -> Result<<V as Visitor<'de>>::Value>
838 where
839 V: Visitor<'de>,
840 {
841 Err(Error::NotSupported)
842 }
843
844 fn deserialize_identifier<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value>
845 where
846 V: Visitor<'de>,
847 {
848 Err(Error::NotSupported)
849 }
850
851 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
852 where
853 V: Visitor<'de>,
854 {
855 self.de.deserialize_ignored_any(visitor)
856 }
857}
858
859struct NewlineSeparated<'a, 'de: 'a> {
860 de: &'a mut Deserializer<'de>,
861}
862
863impl<'a, 'de> NewlineSeparated<'a, 'de> {
864 fn new(de: &'a mut Deserializer<'de>) -> Self {
865 NewlineSeparated { de }
866 }
867}
868
869impl<'de, 'a> SeqAccess<'de> for NewlineSeparated<'a, 'de> {
870 type Error = Error;
871
872 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
873 where
874 T: DeserializeSeed<'de>,
875 {
876 if self.de.peek_delimiter() {
877 return Ok(None);
878 }
879 let mut deserializer = ValueDeserializer::new(self.de, false);
880 seed.deserialize(&mut deserializer).map(Some)
881 }
882}
883
884impl<'de, 'a> MapAccess<'de> for NewlineSeparated<'a, 'de> {
885 type Error = Error;
886
887 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
888 where
889 K: DeserializeSeed<'de>,
890 {
891 if self.de.peek_delimiter() {
892 return Ok(None);
893 }
894 seed.deserialize(&mut *self.de).map(Some)
895 }
896
897 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
898 where
899 V: DeserializeSeed<'de>,
900 {
901 let mut deserializer = ValueDeserializer::new(self.de, true);
902 let result = seed.deserialize(&mut deserializer)?;
903 self.de.parse_delimiter()?;
904 Ok(result)
905 }
906}
907
908#[cfg(test)]
988mod test {
989 use serde::Deserialize;
990
991 #[test]
992 fn test_struct() {
993 #[derive(Deserialize, PartialEq, Debug)]
994 struct Test {
995 #[serde(rename = "NAME")]
996 name: String,
997 #[serde(rename = "DEPENDS")]
998 depends: Vec<String>,
999 #[serde(rename = "BUILDDATE")]
1000 build_date: u32,
1001 }
1002
1003 let j = r#"%NAME%
1004mingw-w64-x86_64-vcdimager
1005
1006%BUILDDATE%
10071592300880
1008
1009%DEPENDS%
1010mingw-w64-x86_64-libcdio
1011mingw-w64-x86_64-libxml2
1012mingw-w64-x86_64-popt"#;
1013 let expected = Test {
1014 build_date: 1592300880,
1015 depends: vec![
1016 "mingw-w64-x86_64-libcdio".to_owned(),
1017 "mingw-w64-x86_64-libxml2".to_owned(),
1018 "mingw-w64-x86_64-popt".to_owned(),
1019 ],
1020 name: "mingw-w64-x86_64-vcdimager".to_owned(),
1021 };
1022 assert_eq!(expected, crate::from_str(j).unwrap());
1023 }
1024}