1use crate::wrap::{Wrap, WrapVariant};
2use crate::{Chain, Error, Track};
3use serde::de::{self, Deserialize, DeserializeSeed, Visitor};
4use std::fmt;
5
6pub fn deserialize<'de, D, T>(deserializer: D) -> Result<T, Error<D::Error>>
8where
9 D: de::Deserializer<'de>,
10 T: Deserialize<'de>,
11{
12 let mut track = Track::new();
13 match T::deserialize(Deserializer::new(deserializer, &mut track)) {
14 Ok(t) => Ok(t),
15 Err(err) => Err(Error {
16 path: track.path(),
17 original: err,
18 }),
19 }
20}
21
22pub struct Deserializer<'a, 'b, D> {
69 de: D,
70 chain: Chain<'a>,
71 track: &'b Track,
72}
73
74impl<'a, 'b, D> Deserializer<'a, 'b, D> {
75 #[allow(clippy::needless_pass_by_ref_mut)]
76 pub fn new(de: D, track: &'b mut Track) -> Self {
77 Deserializer {
78 de,
79 chain: Chain::Root,
80 track,
81 }
82 }
83}
84
85impl<'a, 'b, 'de, D> de::Deserializer<'de> for Deserializer<'a, 'b, D>
87where
88 D: de::Deserializer<'de>,
89{
90 type Error = D::Error;
91
92 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, D::Error>
93 where
94 V: Visitor<'de>,
95 {
96 let chain = self.chain;
97 let track = self.track;
98 self.de
99 .deserialize_any(Wrap::new(visitor, &chain, track))
100 .map_err(|err| track.trigger(&chain, err))
101 }
102
103 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, D::Error>
104 where
105 V: Visitor<'de>,
106 {
107 let chain = self.chain;
108 let track = self.track;
109 self.de
110 .deserialize_bool(Wrap::new(visitor, &chain, track))
111 .map_err(|err| track.trigger(&chain, err))
112 }
113
114 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, D::Error>
115 where
116 V: Visitor<'de>,
117 {
118 let chain = self.chain;
119 let track = self.track;
120 self.de
121 .deserialize_u8(Wrap::new(visitor, &chain, track))
122 .map_err(|err| track.trigger(&chain, err))
123 }
124
125 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, D::Error>
126 where
127 V: Visitor<'de>,
128 {
129 let chain = self.chain;
130 let track = self.track;
131 self.de
132 .deserialize_u16(Wrap::new(visitor, &chain, track))
133 .map_err(|err| track.trigger(&chain, err))
134 }
135
136 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, D::Error>
137 where
138 V: Visitor<'de>,
139 {
140 let chain = self.chain;
141 let track = self.track;
142 self.de
143 .deserialize_u32(Wrap::new(visitor, &chain, track))
144 .map_err(|err| track.trigger(&chain, err))
145 }
146
147 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, D::Error>
148 where
149 V: Visitor<'de>,
150 {
151 let chain = self.chain;
152 let track = self.track;
153 self.de
154 .deserialize_u64(Wrap::new(visitor, &chain, track))
155 .map_err(|err| track.trigger(&chain, err))
156 }
157
158 fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value, D::Error>
159 where
160 V: Visitor<'de>,
161 {
162 let chain = self.chain;
163 let track = self.track;
164 self.de
165 .deserialize_u128(Wrap::new(visitor, &chain, track))
166 .map_err(|err| track.trigger(&chain, err))
167 }
168
169 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, D::Error>
170 where
171 V: Visitor<'de>,
172 {
173 let chain = self.chain;
174 let track = self.track;
175 self.de
176 .deserialize_i8(Wrap::new(visitor, &chain, track))
177 .map_err(|err| track.trigger(&chain, err))
178 }
179
180 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, D::Error>
181 where
182 V: Visitor<'de>,
183 {
184 let chain = self.chain;
185 let track = self.track;
186 self.de
187 .deserialize_i16(Wrap::new(visitor, &chain, track))
188 .map_err(|err| track.trigger(&chain, err))
189 }
190
191 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, D::Error>
192 where
193 V: Visitor<'de>,
194 {
195 let chain = self.chain;
196 let track = self.track;
197 self.de
198 .deserialize_i32(Wrap::new(visitor, &chain, track))
199 .map_err(|err| track.trigger(&chain, err))
200 }
201
202 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, D::Error>
203 where
204 V: Visitor<'de>,
205 {
206 let chain = self.chain;
207 let track = self.track;
208 self.de
209 .deserialize_i64(Wrap::new(visitor, &chain, track))
210 .map_err(|err| track.trigger(&chain, err))
211 }
212
213 fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value, D::Error>
214 where
215 V: Visitor<'de>,
216 {
217 let chain = self.chain;
218 let track = self.track;
219 self.de
220 .deserialize_i128(Wrap::new(visitor, &chain, track))
221 .map_err(|err| track.trigger(&chain, err))
222 }
223
224 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, D::Error>
225 where
226 V: Visitor<'de>,
227 {
228 let chain = self.chain;
229 let track = self.track;
230 self.de
231 .deserialize_f32(Wrap::new(visitor, &chain, track))
232 .map_err(|err| track.trigger(&chain, err))
233 }
234
235 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, D::Error>
236 where
237 V: Visitor<'de>,
238 {
239 let chain = self.chain;
240 let track = self.track;
241 self.de
242 .deserialize_f64(Wrap::new(visitor, &chain, track))
243 .map_err(|err| track.trigger(&chain, err))
244 }
245
246 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, D::Error>
247 where
248 V: Visitor<'de>,
249 {
250 let chain = self.chain;
251 let track = self.track;
252 self.de
253 .deserialize_char(Wrap::new(visitor, &chain, track))
254 .map_err(|err| track.trigger(&chain, err))
255 }
256
257 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, D::Error>
258 where
259 V: Visitor<'de>,
260 {
261 let chain = self.chain;
262 let track = self.track;
263 self.de
264 .deserialize_str(Wrap::new(visitor, &chain, track))
265 .map_err(|err| track.trigger(&chain, err))
266 }
267
268 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, D::Error>
269 where
270 V: Visitor<'de>,
271 {
272 let chain = self.chain;
273 let track = self.track;
274 self.de
275 .deserialize_string(Wrap::new(visitor, &chain, track))
276 .map_err(|err| track.trigger(&chain, err))
277 }
278
279 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, D::Error>
280 where
281 V: Visitor<'de>,
282 {
283 let chain = self.chain;
284 let track = self.track;
285 self.de
286 .deserialize_bytes(Wrap::new(visitor, &chain, track))
287 .map_err(|err| track.trigger(&chain, err))
288 }
289
290 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, D::Error>
291 where
292 V: Visitor<'de>,
293 {
294 let chain = self.chain;
295 let track = self.track;
296 self.de
297 .deserialize_byte_buf(Wrap::new(visitor, &chain, track))
298 .map_err(|err| track.trigger(&chain, err))
299 }
300
301 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, D::Error>
302 where
303 V: Visitor<'de>,
304 {
305 let chain = self.chain;
306 let track = self.track;
307 self.de
308 .deserialize_option(Wrap::new(visitor, &chain, track))
309 .map_err(|err| track.trigger(&chain, err))
310 }
311
312 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, D::Error>
313 where
314 V: Visitor<'de>,
315 {
316 let chain = self.chain;
317 let track = self.track;
318 self.de
319 .deserialize_unit(Wrap::new(visitor, &chain, track))
320 .map_err(|err| track.trigger(&chain, err))
321 }
322
323 fn deserialize_unit_struct<V>(
324 self,
325 name: &'static str,
326 visitor: V,
327 ) -> Result<V::Value, D::Error>
328 where
329 V: Visitor<'de>,
330 {
331 let chain = self.chain;
332 let track = self.track;
333 self.de
334 .deserialize_unit_struct(name, Wrap::new(visitor, &chain, track))
335 .map_err(|err| track.trigger(&chain, err))
336 }
337
338 fn deserialize_newtype_struct<V>(
339 self,
340 name: &'static str,
341 visitor: V,
342 ) -> Result<V::Value, D::Error>
343 where
344 V: Visitor<'de>,
345 {
346 let chain = self.chain;
347 let track = self.track;
348 self.de
349 .deserialize_newtype_struct(name, Wrap::new(visitor, &chain, track))
350 .map_err(|err| track.trigger(&chain, err))
351 }
352
353 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, D::Error>
354 where
355 V: Visitor<'de>,
356 {
357 let chain = self.chain;
358 let track = self.track;
359 self.de
360 .deserialize_seq(Wrap::new(visitor, &chain, track))
361 .map_err(|err| track.trigger(&chain, err))
362 }
363
364 fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, D::Error>
365 where
366 V: Visitor<'de>,
367 {
368 let chain = self.chain;
369 let track = self.track;
370 self.de
371 .deserialize_tuple(len, Wrap::new(visitor, &chain, track))
372 .map_err(|err| track.trigger(&chain, err))
373 }
374
375 fn deserialize_tuple_struct<V>(
376 self,
377 name: &'static str,
378 len: usize,
379 visitor: V,
380 ) -> Result<V::Value, D::Error>
381 where
382 V: Visitor<'de>,
383 {
384 let chain = self.chain;
385 let track = self.track;
386 self.de
387 .deserialize_tuple_struct(name, len, Wrap::new(visitor, &chain, track))
388 .map_err(|err| track.trigger(&chain, err))
389 }
390
391 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, D::Error>
392 where
393 V: Visitor<'de>,
394 {
395 let chain = self.chain;
396 let track = self.track;
397 self.de
398 .deserialize_map(Wrap::new(visitor, &chain, track))
399 .map_err(|err| track.trigger(&chain, err))
400 }
401
402 fn deserialize_struct<V>(
403 self,
404 name: &'static str,
405 fields: &'static [&'static str],
406 visitor: V,
407 ) -> Result<V::Value, D::Error>
408 where
409 V: Visitor<'de>,
410 {
411 let chain = self.chain;
412 let track = self.track;
413 self.de
414 .deserialize_struct(name, fields, Wrap::new(visitor, &chain, track))
415 .map_err(|err| track.trigger(&chain, err))
416 }
417
418 fn deserialize_enum<V>(
419 self,
420 name: &'static str,
421 variants: &'static [&'static str],
422 visitor: V,
423 ) -> Result<V::Value, D::Error>
424 where
425 V: Visitor<'de>,
426 {
427 let chain = self.chain;
428 let track = self.track;
429 self.de
430 .deserialize_enum(name, variants, Wrap::new(visitor, &chain, track))
431 .map_err(|err| track.trigger(&chain, err))
432 }
433
434 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, D::Error>
435 where
436 V: Visitor<'de>,
437 {
438 let chain = self.chain;
439 let track = self.track;
440 self.de
441 .deserialize_ignored_any(Wrap::new(visitor, &chain, track))
442 .map_err(|err| track.trigger(&chain, err))
443 }
444
445 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, D::Error>
446 where
447 V: Visitor<'de>,
448 {
449 let chain = self.chain;
450 let track = self.track;
451 self.de
452 .deserialize_identifier(Wrap::new(visitor, &chain, track))
453 .map_err(|err| track.trigger(&chain, err))
454 }
455
456 fn is_human_readable(&self) -> bool {
457 self.de.is_human_readable()
458 }
459}
460
461impl<'a, 'b, 'de, X> Visitor<'de> for Wrap<'a, 'b, X>
463where
464 X: Visitor<'de>,
465{
466 type Value = X::Value;
467
468 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
469 self.delegate.expecting(formatter)
470 }
471
472 fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
473 where
474 E: de::Error,
475 {
476 let chain = self.chain;
477 let track = self.track;
478 self.delegate
479 .visit_bool(v)
480 .map_err(|err| track.trigger(chain, err))
481 }
482
483 fn visit_i8<E>(self, v: i8) -> Result<Self::Value, E>
484 where
485 E: de::Error,
486 {
487 let chain = self.chain;
488 let track = self.track;
489 self.delegate
490 .visit_i8(v)
491 .map_err(|err| track.trigger(chain, err))
492 }
493
494 fn visit_i16<E>(self, v: i16) -> Result<Self::Value, E>
495 where
496 E: de::Error,
497 {
498 let chain = self.chain;
499 let track = self.track;
500 self.delegate
501 .visit_i16(v)
502 .map_err(|err| track.trigger(chain, err))
503 }
504
505 fn visit_i32<E>(self, v: i32) -> Result<Self::Value, E>
506 where
507 E: de::Error,
508 {
509 let chain = self.chain;
510 let track = self.track;
511 self.delegate
512 .visit_i32(v)
513 .map_err(|err| track.trigger(chain, err))
514 }
515
516 fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
517 where
518 E: de::Error,
519 {
520 let chain = self.chain;
521 let track = self.track;
522 self.delegate
523 .visit_i64(v)
524 .map_err(|err| track.trigger(chain, err))
525 }
526
527 fn visit_i128<E>(self, v: i128) -> Result<Self::Value, E>
528 where
529 E: de::Error,
530 {
531 let chain = self.chain;
532 let track = self.track;
533 self.delegate
534 .visit_i128(v)
535 .map_err(|err| track.trigger(chain, err))
536 }
537
538 fn visit_u8<E>(self, v: u8) -> Result<Self::Value, E>
539 where
540 E: de::Error,
541 {
542 let chain = self.chain;
543 let track = self.track;
544 self.delegate
545 .visit_u8(v)
546 .map_err(|err| track.trigger(chain, err))
547 }
548
549 fn visit_u16<E>(self, v: u16) -> Result<Self::Value, E>
550 where
551 E: de::Error,
552 {
553 let chain = self.chain;
554 let track = self.track;
555 self.delegate
556 .visit_u16(v)
557 .map_err(|err| track.trigger(chain, err))
558 }
559
560 fn visit_u32<E>(self, v: u32) -> Result<Self::Value, E>
561 where
562 E: de::Error,
563 {
564 let chain = self.chain;
565 let track = self.track;
566 self.delegate
567 .visit_u32(v)
568 .map_err(|err| track.trigger(chain, err))
569 }
570
571 fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
572 where
573 E: de::Error,
574 {
575 let chain = self.chain;
576 let track = self.track;
577 self.delegate
578 .visit_u64(v)
579 .map_err(|err| track.trigger(chain, err))
580 }
581
582 fn visit_u128<E>(self, v: u128) -> Result<Self::Value, E>
583 where
584 E: de::Error,
585 {
586 let chain = self.chain;
587 let track = self.track;
588 self.delegate
589 .visit_u128(v)
590 .map_err(|err| track.trigger(chain, err))
591 }
592
593 fn visit_f32<E>(self, v: f32) -> Result<Self::Value, E>
594 where
595 E: de::Error,
596 {
597 let chain = self.chain;
598 let track = self.track;
599 self.delegate
600 .visit_f32(v)
601 .map_err(|err| track.trigger(chain, err))
602 }
603
604 fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
605 where
606 E: de::Error,
607 {
608 let chain = self.chain;
609 let track = self.track;
610 self.delegate
611 .visit_f64(v)
612 .map_err(|err| track.trigger(chain, err))
613 }
614
615 fn visit_char<E>(self, v: char) -> Result<Self::Value, E>
616 where
617 E: de::Error,
618 {
619 let chain = self.chain;
620 let track = self.track;
621 self.delegate
622 .visit_char(v)
623 .map_err(|err| track.trigger(chain, err))
624 }
625
626 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
627 where
628 E: de::Error,
629 {
630 let chain = self.chain;
631 let track = self.track;
632 self.delegate
633 .visit_str(v)
634 .map_err(|err| track.trigger(chain, err))
635 }
636
637 fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
638 where
639 E: de::Error,
640 {
641 let chain = self.chain;
642 let track = self.track;
643 self.delegate
644 .visit_borrowed_str(v)
645 .map_err(|err| track.trigger(chain, err))
646 }
647
648 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
649 where
650 E: de::Error,
651 {
652 let chain = self.chain;
653 let track = self.track;
654 self.delegate
655 .visit_string(v)
656 .map_err(|err| track.trigger(chain, err))
657 }
658
659 fn visit_unit<E>(self) -> Result<Self::Value, E>
660 where
661 E: de::Error,
662 {
663 let chain = self.chain;
664 let track = self.track;
665 self.delegate
666 .visit_unit()
667 .map_err(|err| track.trigger(chain, err))
668 }
669
670 fn visit_none<E>(self) -> Result<Self::Value, E>
671 where
672 E: de::Error,
673 {
674 let chain = self.chain;
675 let track = self.track;
676 self.delegate
677 .visit_none()
678 .map_err(|err| track.trigger(chain, err))
679 }
680
681 fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
682 where
683 D: de::Deserializer<'de>,
684 {
685 let chain = self.chain;
686 let track = self.track;
687 self.delegate
688 .visit_some(Deserializer {
689 de: deserializer,
690 chain: Chain::Some { parent: chain },
691 track,
692 })
693 .map_err(|err| track.trigger(chain, err))
694 }
695
696 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
697 where
698 D: de::Deserializer<'de>,
699 {
700 let chain = self.chain;
701 let track = self.track;
702 self.delegate
703 .visit_newtype_struct(Deserializer {
704 de: deserializer,
705 chain: Chain::NewtypeStruct { parent: chain },
706 track,
707 })
708 .map_err(|err| track.trigger(chain, err))
709 }
710
711 fn visit_seq<V>(self, visitor: V) -> Result<Self::Value, V::Error>
712 where
713 V: de::SeqAccess<'de>,
714 {
715 let chain = self.chain;
716 let track = self.track;
717 self.delegate
718 .visit_seq(SeqAccess::new(visitor, chain, track))
719 .map_err(|err| track.trigger(chain, err))
720 }
721
722 fn visit_map<V>(self, visitor: V) -> Result<Self::Value, V::Error>
723 where
724 V: de::MapAccess<'de>,
725 {
726 let chain = self.chain;
727 let track = self.track;
728 self.delegate
729 .visit_map(MapAccess::new(visitor, chain, track))
730 .map_err(|err| track.trigger(chain, err))
731 }
732
733 fn visit_enum<V>(self, visitor: V) -> Result<Self::Value, V::Error>
734 where
735 V: de::EnumAccess<'de>,
736 {
737 let chain = self.chain;
738 let track = self.track;
739 self.delegate
740 .visit_enum(Wrap::new(visitor, chain, track))
741 .map_err(|err| track.trigger(chain, err))
742 }
743
744 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
745 where
746 E: de::Error,
747 {
748 let chain = self.chain;
749 let track = self.track;
750 self.delegate
751 .visit_bytes(v)
752 .map_err(|err| track.trigger(chain, err))
753 }
754
755 fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>
756 where
757 E: de::Error,
758 {
759 let chain = self.chain;
760 let track = self.track;
761 self.delegate
762 .visit_borrowed_bytes(v)
763 .map_err(|err| track.trigger(chain, err))
764 }
765
766 fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
767 where
768 E: de::Error,
769 {
770 let chain = self.chain;
771 let track = self.track;
772 self.delegate
773 .visit_byte_buf(v)
774 .map_err(|err| track.trigger(chain, err))
775 }
776}
777
778impl<'a, 'b, 'de, X> de::EnumAccess<'de> for Wrap<'a, 'b, X>
780where
781 X: de::EnumAccess<'de> + 'a,
782{
783 type Error = X::Error;
784 type Variant = WrapVariant<'a, 'b, X::Variant>;
785
786 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), X::Error>
787 where
788 V: DeserializeSeed<'de>,
789 {
790 let chain = self.chain;
791 let track = self.track;
792 let mut variant = None;
793 self.delegate
794 .variant_seed(CaptureKey::new(seed, &mut variant))
795 .map_err(|err| track.trigger(chain, err))
796 .map(move |(v, vis)| {
797 let chain = match variant {
798 Some(variant) => Chain::Enum {
799 parent: chain,
800 variant,
801 },
802 None => Chain::NonStringKey { parent: chain },
803 };
804 (v, WrapVariant::new(vis, chain, track))
805 })
806 }
807}
808
809impl<'a, 'b, 'de, X> de::VariantAccess<'de> for WrapVariant<'a, 'b, X>
811where
812 X: de::VariantAccess<'de>,
813{
814 type Error = X::Error;
815
816 fn unit_variant(self) -> Result<(), X::Error> {
817 let chain = self.chain;
818 let track = self.track;
819 self.delegate
820 .unit_variant()
821 .map_err(|err| track.trigger(&chain, err))
822 }
823
824 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, X::Error>
825 where
826 T: DeserializeSeed<'de>,
827 {
828 let chain = self.chain;
829 let track = self.track;
830 let nested = Chain::NewtypeVariant { parent: &chain };
831 self.delegate
832 .newtype_variant_seed(TrackedSeed::new(seed, nested, track))
833 .map_err(|err| track.trigger(&chain, err))
834 }
835
836 fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value, X::Error>
837 where
838 V: Visitor<'de>,
839 {
840 let chain = self.chain;
841 let track = self.track;
842 self.delegate
843 .tuple_variant(len, Wrap::new(visitor, &chain, track))
844 .map_err(|err| track.trigger(&chain, err))
845 }
846
847 fn struct_variant<V>(
848 self,
849 fields: &'static [&'static str],
850 visitor: V,
851 ) -> Result<V::Value, X::Error>
852 where
853 V: Visitor<'de>,
854 {
855 let chain = self.chain;
856 let track = self.track;
857 self.delegate
858 .struct_variant(fields, Wrap::new(visitor, &chain, track))
859 .map_err(|err| track.trigger(&chain, err))
860 }
861}
862
863struct CaptureKey<'a, X> {
866 delegate: X,
867 key: &'a mut Option<String>,
868}
869
870impl<'a, X> CaptureKey<'a, X> {
871 fn new(delegate: X, key: &'a mut Option<String>) -> Self {
872 CaptureKey { delegate, key }
873 }
874}
875
876impl<'a, 'de, X> DeserializeSeed<'de> for CaptureKey<'a, X>
878where
879 X: DeserializeSeed<'de>,
880{
881 type Value = X::Value;
882
883 fn deserialize<D>(self, deserializer: D) -> Result<X::Value, D::Error>
884 where
885 D: de::Deserializer<'de>,
886 {
887 self.delegate
888 .deserialize(CaptureKey::new(deserializer, self.key))
889 }
890}
891
892impl<'a, 'de, X> de::Deserializer<'de> for CaptureKey<'a, X>
894where
895 X: de::Deserializer<'de>,
896{
897 type Error = X::Error;
898
899 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, X::Error>
900 where
901 V: Visitor<'de>,
902 {
903 self.delegate
904 .deserialize_any(CaptureKey::new(visitor, self.key))
905 }
906
907 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, X::Error>
908 where
909 V: Visitor<'de>,
910 {
911 self.delegate
912 .deserialize_bool(CaptureKey::new(visitor, self.key))
913 }
914
915 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, X::Error>
916 where
917 V: Visitor<'de>,
918 {
919 self.delegate
920 .deserialize_u8(CaptureKey::new(visitor, self.key))
921 }
922
923 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, X::Error>
924 where
925 V: Visitor<'de>,
926 {
927 self.delegate
928 .deserialize_u16(CaptureKey::new(visitor, self.key))
929 }
930
931 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, X::Error>
932 where
933 V: Visitor<'de>,
934 {
935 self.delegate
936 .deserialize_u32(CaptureKey::new(visitor, self.key))
937 }
938
939 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, X::Error>
940 where
941 V: Visitor<'de>,
942 {
943 self.delegate
944 .deserialize_u64(CaptureKey::new(visitor, self.key))
945 }
946
947 fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value, X::Error>
948 where
949 V: Visitor<'de>,
950 {
951 self.delegate
952 .deserialize_u128(CaptureKey::new(visitor, self.key))
953 }
954
955 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, X::Error>
956 where
957 V: Visitor<'de>,
958 {
959 self.delegate
960 .deserialize_i8(CaptureKey::new(visitor, self.key))
961 }
962
963 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, X::Error>
964 where
965 V: Visitor<'de>,
966 {
967 self.delegate
968 .deserialize_i16(CaptureKey::new(visitor, self.key))
969 }
970
971 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, X::Error>
972 where
973 V: Visitor<'de>,
974 {
975 self.delegate
976 .deserialize_i32(CaptureKey::new(visitor, self.key))
977 }
978
979 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, X::Error>
980 where
981 V: Visitor<'de>,
982 {
983 self.delegate
984 .deserialize_i64(CaptureKey::new(visitor, self.key))
985 }
986
987 fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value, X::Error>
988 where
989 V: Visitor<'de>,
990 {
991 self.delegate
992 .deserialize_i128(CaptureKey::new(visitor, self.key))
993 }
994
995 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, X::Error>
996 where
997 V: Visitor<'de>,
998 {
999 self.delegate
1000 .deserialize_f32(CaptureKey::new(visitor, self.key))
1001 }
1002
1003 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, X::Error>
1004 where
1005 V: Visitor<'de>,
1006 {
1007 self.delegate
1008 .deserialize_f64(CaptureKey::new(visitor, self.key))
1009 }
1010
1011 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, X::Error>
1012 where
1013 V: Visitor<'de>,
1014 {
1015 self.delegate
1016 .deserialize_char(CaptureKey::new(visitor, self.key))
1017 }
1018
1019 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, X::Error>
1020 where
1021 V: Visitor<'de>,
1022 {
1023 self.delegate
1024 .deserialize_str(CaptureKey::new(visitor, self.key))
1025 }
1026
1027 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, X::Error>
1028 where
1029 V: Visitor<'de>,
1030 {
1031 self.delegate
1032 .deserialize_string(CaptureKey::new(visitor, self.key))
1033 }
1034
1035 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, X::Error>
1036 where
1037 V: Visitor<'de>,
1038 {
1039 self.delegate
1040 .deserialize_bytes(CaptureKey::new(visitor, self.key))
1041 }
1042
1043 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, X::Error>
1044 where
1045 V: Visitor<'de>,
1046 {
1047 self.delegate
1048 .deserialize_byte_buf(CaptureKey::new(visitor, self.key))
1049 }
1050
1051 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, X::Error>
1052 where
1053 V: Visitor<'de>,
1054 {
1055 self.delegate
1056 .deserialize_option(CaptureKey::new(visitor, self.key))
1057 }
1058
1059 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, X::Error>
1060 where
1061 V: Visitor<'de>,
1062 {
1063 self.delegate
1064 .deserialize_unit(CaptureKey::new(visitor, self.key))
1065 }
1066
1067 fn deserialize_unit_struct<V>(
1068 self,
1069 name: &'static str,
1070 visitor: V,
1071 ) -> Result<V::Value, X::Error>
1072 where
1073 V: Visitor<'de>,
1074 {
1075 self.delegate
1076 .deserialize_unit_struct(name, CaptureKey::new(visitor, self.key))
1077 }
1078
1079 fn deserialize_newtype_struct<V>(
1080 self,
1081 name: &'static str,
1082 visitor: V,
1083 ) -> Result<V::Value, X::Error>
1084 where
1085 V: Visitor<'de>,
1086 {
1087 self.delegate
1088 .deserialize_newtype_struct(name, CaptureKey::new(visitor, self.key))
1089 }
1090
1091 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, X::Error>
1092 where
1093 V: Visitor<'de>,
1094 {
1095 self.delegate
1096 .deserialize_seq(CaptureKey::new(visitor, self.key))
1097 }
1098
1099 fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, X::Error>
1100 where
1101 V: Visitor<'de>,
1102 {
1103 self.delegate
1104 .deserialize_tuple(len, CaptureKey::new(visitor, self.key))
1105 }
1106
1107 fn deserialize_tuple_struct<V>(
1108 self,
1109 name: &'static str,
1110 len: usize,
1111 visitor: V,
1112 ) -> Result<V::Value, X::Error>
1113 where
1114 V: Visitor<'de>,
1115 {
1116 self.delegate
1117 .deserialize_tuple_struct(name, len, CaptureKey::new(visitor, self.key))
1118 }
1119
1120 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, X::Error>
1121 where
1122 V: Visitor<'de>,
1123 {
1124 self.delegate
1125 .deserialize_map(CaptureKey::new(visitor, self.key))
1126 }
1127
1128 fn deserialize_struct<V>(
1129 self,
1130 name: &'static str,
1131 fields: &'static [&'static str],
1132 visitor: V,
1133 ) -> Result<V::Value, X::Error>
1134 where
1135 V: Visitor<'de>,
1136 {
1137 self.delegate
1138 .deserialize_struct(name, fields, CaptureKey::new(visitor, self.key))
1139 }
1140
1141 fn deserialize_enum<V>(
1142 self,
1143 name: &'static str,
1144 variants: &'static [&'static str],
1145 visitor: V,
1146 ) -> Result<V::Value, X::Error>
1147 where
1148 V: Visitor<'de>,
1149 {
1150 self.delegate
1151 .deserialize_enum(name, variants, CaptureKey::new(visitor, self.key))
1152 }
1153
1154 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, X::Error>
1155 where
1156 V: Visitor<'de>,
1157 {
1158 self.delegate
1159 .deserialize_ignored_any(CaptureKey::new(visitor, self.key))
1160 }
1161
1162 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, X::Error>
1163 where
1164 V: Visitor<'de>,
1165 {
1166 self.delegate
1167 .deserialize_identifier(CaptureKey::new(visitor, self.key))
1168 }
1169
1170 fn is_human_readable(&self) -> bool {
1171 self.delegate.is_human_readable()
1172 }
1173}
1174
1175impl<'a, 'de, X> Visitor<'de> for CaptureKey<'a, X>
1177where
1178 X: Visitor<'de>,
1179{
1180 type Value = X::Value;
1181
1182 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1183 self.delegate.expecting(formatter)
1184 }
1185
1186 fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
1187 where
1188 E: de::Error,
1189 {
1190 let string = if v { "true" } else { "false" };
1191 *self.key = Some(string.to_owned());
1192 self.delegate.visit_bool(v)
1193 }
1194
1195 fn visit_i8<E>(self, v: i8) -> Result<Self::Value, E>
1196 where
1197 E: de::Error,
1198 {
1199 *self.key = Some(itoa::Buffer::new().format(v).to_owned());
1200 self.delegate.visit_i8(v)
1201 }
1202
1203 fn visit_i16<E>(self, v: i16) -> Result<Self::Value, E>
1204 where
1205 E: de::Error,
1206 {
1207 *self.key = Some(itoa::Buffer::new().format(v).to_owned());
1208 self.delegate.visit_i16(v)
1209 }
1210
1211 fn visit_i32<E>(self, v: i32) -> Result<Self::Value, E>
1212 where
1213 E: de::Error,
1214 {
1215 *self.key = Some(itoa::Buffer::new().format(v).to_owned());
1216 self.delegate.visit_i32(v)
1217 }
1218
1219 fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
1220 where
1221 E: de::Error,
1222 {
1223 *self.key = Some(itoa::Buffer::new().format(v).to_owned());
1224 self.delegate.visit_i64(v)
1225 }
1226
1227 fn visit_i128<E>(self, v: i128) -> Result<Self::Value, E>
1228 where
1229 E: de::Error,
1230 {
1231 *self.key = Some(itoa::Buffer::new().format(v).to_owned());
1232 self.delegate.visit_i128(v)
1233 }
1234
1235 fn visit_u8<E>(self, v: u8) -> Result<Self::Value, E>
1236 where
1237 E: de::Error,
1238 {
1239 *self.key = Some(itoa::Buffer::new().format(v).to_owned());
1240 self.delegate.visit_u8(v)
1241 }
1242
1243 fn visit_u16<E>(self, v: u16) -> Result<Self::Value, E>
1244 where
1245 E: de::Error,
1246 {
1247 *self.key = Some(itoa::Buffer::new().format(v).to_owned());
1248 self.delegate.visit_u16(v)
1249 }
1250
1251 fn visit_u32<E>(self, v: u32) -> Result<Self::Value, E>
1252 where
1253 E: de::Error,
1254 {
1255 *self.key = Some(itoa::Buffer::new().format(v).to_owned());
1256 self.delegate.visit_u32(v)
1257 }
1258
1259 fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
1260 where
1261 E: de::Error,
1262 {
1263 *self.key = Some(itoa::Buffer::new().format(v).to_owned());
1264 self.delegate.visit_u64(v)
1265 }
1266
1267 fn visit_u128<E>(self, v: u128) -> Result<Self::Value, E>
1268 where
1269 E: de::Error,
1270 {
1271 *self.key = Some(itoa::Buffer::new().format(v).to_owned());
1272 self.delegate.visit_u128(v)
1273 }
1274
1275 fn visit_f32<E>(self, v: f32) -> Result<Self::Value, E>
1276 where
1277 E: de::Error,
1278 {
1279 self.delegate.visit_f32(v)
1280 }
1281
1282 fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
1283 where
1284 E: de::Error,
1285 {
1286 self.delegate.visit_f64(v)
1287 }
1288
1289 fn visit_char<E>(self, v: char) -> Result<Self::Value, E>
1290 where
1291 E: de::Error,
1292 {
1293 self.delegate.visit_char(v)
1294 }
1295
1296 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
1297 where
1298 E: de::Error,
1299 {
1300 *self.key = Some(v.to_owned());
1301 self.delegate.visit_str(v)
1302 }
1303
1304 fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
1305 where
1306 E: de::Error,
1307 {
1308 *self.key = Some(v.to_owned());
1309 self.delegate.visit_borrowed_str(v)
1310 }
1311
1312 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
1313 where
1314 E: de::Error,
1315 {
1316 *self.key = Some(v.clone());
1317 self.delegate.visit_string(v)
1318 }
1319
1320 fn visit_unit<E>(self) -> Result<Self::Value, E>
1321 where
1322 E: de::Error,
1323 {
1324 self.delegate.visit_unit()
1325 }
1326
1327 fn visit_none<E>(self) -> Result<Self::Value, E>
1328 where
1329 E: de::Error,
1330 {
1331 self.delegate.visit_none()
1332 }
1333
1334 fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
1335 where
1336 D: de::Deserializer<'de>,
1337 {
1338 self.delegate.visit_some(deserializer)
1339 }
1340
1341 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
1342 where
1343 D: de::Deserializer<'de>,
1344 {
1345 self.delegate.visit_newtype_struct(deserializer)
1346 }
1347
1348 fn visit_seq<V>(self, visitor: V) -> Result<Self::Value, V::Error>
1349 where
1350 V: de::SeqAccess<'de>,
1351 {
1352 self.delegate.visit_seq(visitor)
1353 }
1354
1355 fn visit_map<V>(self, visitor: V) -> Result<Self::Value, V::Error>
1356 where
1357 V: de::MapAccess<'de>,
1358 {
1359 self.delegate.visit_map(visitor)
1360 }
1361
1362 fn visit_enum<V>(self, visitor: V) -> Result<Self::Value, V::Error>
1363 where
1364 V: de::EnumAccess<'de>,
1365 {
1366 self.delegate.visit_enum(visitor)
1367 }
1368
1369 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
1370 where
1371 E: de::Error,
1372 {
1373 self.delegate.visit_bytes(v)
1374 }
1375
1376 fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>
1377 where
1378 E: de::Error,
1379 {
1380 self.delegate.visit_borrowed_bytes(v)
1381 }
1382
1383 fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
1384 where
1385 E: de::Error,
1386 {
1387 self.delegate.visit_byte_buf(v)
1388 }
1389}
1390
1391struct TrackedSeed<'a, 'b, X> {
1394 seed: X,
1395 chain: Chain<'a>,
1396 track: &'b Track,
1397}
1398
1399impl<'a, 'b, X> TrackedSeed<'a, 'b, X> {
1400 fn new(seed: X, chain: Chain<'a>, track: &'b Track) -> Self {
1401 TrackedSeed { seed, chain, track }
1402 }
1403}
1404
1405impl<'a, 'b, 'de, X> DeserializeSeed<'de> for TrackedSeed<'a, 'b, X>
1406where
1407 X: DeserializeSeed<'de>,
1408{
1409 type Value = X::Value;
1410
1411 fn deserialize<D>(self, deserializer: D) -> Result<X::Value, D::Error>
1412 where
1413 D: de::Deserializer<'de>,
1414 {
1415 let chain = self.chain;
1416 let track = self.track;
1417 self.seed
1418 .deserialize(Deserializer {
1419 de: deserializer,
1420 chain: chain.clone(),
1421 track,
1422 })
1423 .map_err(|err| track.trigger(&chain, err))
1424 }
1425}
1426
1427struct SeqAccess<'a, 'b, X> {
1429 delegate: X,
1430 chain: &'a Chain<'a>,
1431 index: usize,
1432 track: &'b Track,
1433}
1434
1435impl<'a, 'b, X> SeqAccess<'a, 'b, X> {
1436 fn new(delegate: X, chain: &'a Chain<'a>, track: &'b Track) -> Self {
1437 SeqAccess {
1438 delegate,
1439 chain,
1440 index: 0,
1441 track,
1442 }
1443 }
1444}
1445
1446impl<'a, 'b, 'de, X> de::SeqAccess<'de> for SeqAccess<'a, 'b, X>
1448where
1449 X: de::SeqAccess<'de>,
1450{
1451 type Error = X::Error;
1452
1453 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, X::Error>
1454 where
1455 T: DeserializeSeed<'de>,
1456 {
1457 let parent = self.chain;
1458 let chain = Chain::Seq {
1459 parent,
1460 index: self.index,
1461 };
1462 let track = self.track;
1463 self.index += 1;
1464 self.delegate
1465 .next_element_seed(TrackedSeed::new(seed, chain, track))
1466 .map_err(|err| track.trigger(parent, err))
1467 }
1468
1469 fn size_hint(&self) -> Option<usize> {
1470 self.delegate.size_hint()
1471 }
1472}
1473
1474struct MapAccess<'a, 'b, X> {
1477 delegate: X,
1478 chain: &'a Chain<'a>,
1479 key: Option<String>,
1480 track: &'b Track,
1481}
1482
1483impl<'a, 'b, X> MapAccess<'a, 'b, X> {
1484 fn new(delegate: X, chain: &'a Chain<'a>, track: &'b Track) -> Self {
1485 MapAccess {
1486 delegate,
1487 chain,
1488 key: None,
1489 track,
1490 }
1491 }
1492}
1493
1494impl<'a, 'b, 'de, X> de::MapAccess<'de> for MapAccess<'a, 'b, X>
1495where
1496 X: de::MapAccess<'de>,
1497{
1498 type Error = X::Error;
1499
1500 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, X::Error>
1501 where
1502 K: DeserializeSeed<'de>,
1503 {
1504 let chain = self.chain;
1505 let track = self.track;
1506 let key = &mut self.key;
1507 self.delegate
1508 .next_key_seed(CaptureKey::new(seed, key))
1509 .map_err(|err| {
1510 let chain = match key.take() {
1511 Some(key) => Chain::Map { parent: chain, key },
1512 None => Chain::NonStringKey { parent: chain },
1513 };
1514 track.trigger(&chain, err)
1515 })
1516 }
1517
1518 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, X::Error>
1519 where
1520 V: DeserializeSeed<'de>,
1521 {
1522 let parent = self.chain;
1523 let chain = match self.key.take() {
1524 Some(key) => Chain::Map { parent, key },
1525 None => Chain::NonStringKey { parent },
1526 };
1527 let track = self.track;
1528 self.delegate
1529 .next_value_seed(TrackedSeed::new(seed, chain, track))
1530 .map_err(|err| track.trigger(parent, err))
1531 }
1532
1533 fn size_hint(&self) -> Option<usize> {
1534 self.delegate.size_hint()
1535 }
1536}