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