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