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