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