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