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 let path = self.path;
433 self.value.broadcast_end_mark();
434 if super::should_short_circuit_any(self.field_transformer.is_some()) {
435 unsafe {
438 save_deserializer_state(
439 Some(self.value.clone()),
440 self.path,
441 self.unused_key_callback,
442 self.field_transformer,
443 );
444 }
445 return Err(Error::custom("Value deserialized via fast path"));
446 }
447 maybe_transform_and_forward_to_value_deserializer!(self, deserialize_any, visitor);
448
449 maybe_why_not!(
450 self.value,
451 match self.value {
452 Value::Null(..) => visitor.visit_unit(),
453 Value::Bool(v, ..) => visitor.visit_bool(*v),
454 Value::Number(n, ..) => n.deserialize_any(visitor),
455 Value::String(v, ..) => visitor.visit_borrowed_str(v),
456 Value::Sequence(v, ..) => visit_sequence_ref(
457 v,
458 self.path,
459 visitor,
460 self.unused_key_callback,
461 self.field_transformer,
462 ),
463 Value::Mapping(v, ..) => visit_mapping_ref(
464 v,
465 self.path,
466 visitor,
467 self.unused_key_callback,
468 self.field_transformer,
469 ),
470 Value::Tagged(tagged, ..) => visitor.visit_enum(&**tagged),
471 }
472 .map_err(|e| error::set_span(e, span, path))
473 )
474 }
475
476 fn deserialize_bool<V>(mut self, visitor: V) -> Result<V::Value, Error>
477 where
478 V: Visitor<'de>,
479 {
480 maybe_transform_and_forward_to_value_deserializer!(self, deserialize_bool, visitor);
481
482 let span = self.value.span().clone();
483 let path = self.path;
484 self.value.broadcast_end_mark();
485 maybe_why_not!(
486 self.value,
487 match self.value.untag_ref() {
488 Value::Bool(v, ..) => visitor.visit_bool(*v),
489 other => Err(other.invalid_type(&visitor)),
490 }
491 .map_err(|e| error::set_span(e, span, path))
492 )
493 }
494
495 fn deserialize_i8<V>(mut self, visitor: V) -> Result<V::Value, Error>
496 where
497 V: Visitor<'de>,
498 {
499 maybe_transform_and_forward_to_value_deserializer!(self, deserialize_i8, visitor);
500
501 self.value.deserialize_number(visitor)
502 }
503
504 fn deserialize_i16<V>(mut self, visitor: V) -> Result<V::Value, Error>
505 where
506 V: Visitor<'de>,
507 {
508 maybe_transform_and_forward_to_value_deserializer!(self, deserialize_i16, visitor);
509
510 self.value.deserialize_number(visitor)
511 }
512
513 fn deserialize_i32<V>(mut self, visitor: V) -> Result<V::Value, Error>
514 where
515 V: Visitor<'de>,
516 {
517 maybe_transform_and_forward_to_value_deserializer!(self, deserialize_i32, visitor);
518
519 self.value.deserialize_number(visitor)
520 }
521
522 fn deserialize_i64<V>(mut self, visitor: V) -> Result<V::Value, Error>
523 where
524 V: Visitor<'de>,
525 {
526 maybe_transform_and_forward_to_value_deserializer!(self, deserialize_i64, visitor);
527
528 self.value.deserialize_number(visitor)
529 }
530
531 fn deserialize_i128<V>(mut self, visitor: V) -> Result<V::Value, Error>
532 where
533 V: Visitor<'de>,
534 {
535 maybe_transform_and_forward_to_value_deserializer!(self, deserialize_i128, visitor);
536
537 self.value.deserialize_number(visitor)
538 }
539
540 fn deserialize_u8<V>(mut self, visitor: V) -> Result<V::Value, Error>
541 where
542 V: Visitor<'de>,
543 {
544 maybe_transform_and_forward_to_value_deserializer!(self, deserialize_u8, visitor);
545
546 self.value.deserialize_number(visitor)
547 }
548
549 fn deserialize_u16<V>(mut self, visitor: V) -> Result<V::Value, Error>
550 where
551 V: Visitor<'de>,
552 {
553 maybe_transform_and_forward_to_value_deserializer!(self, deserialize_u16, visitor);
554
555 self.value.deserialize_number(visitor)
556 }
557
558 fn deserialize_u32<V>(mut self, visitor: V) -> Result<V::Value, Error>
559 where
560 V: Visitor<'de>,
561 {
562 maybe_transform_and_forward_to_value_deserializer!(self, deserialize_u32, visitor);
563
564 self.value.deserialize_number(visitor)
565 }
566
567 fn deserialize_u64<V>(mut self, visitor: V) -> Result<V::Value, Error>
568 where
569 V: Visitor<'de>,
570 {
571 maybe_transform_and_forward_to_value_deserializer!(self, deserialize_u64, visitor);
572
573 self.value.deserialize_number(visitor)
574 }
575
576 fn deserialize_u128<V>(mut self, visitor: V) -> Result<V::Value, Error>
577 where
578 V: Visitor<'de>,
579 {
580 maybe_transform_and_forward_to_value_deserializer!(self, deserialize_u128, visitor);
581
582 self.value.deserialize_number(visitor)
583 }
584
585 fn deserialize_f32<V>(mut self, visitor: V) -> Result<V::Value, Error>
586 where
587 V: Visitor<'de>,
588 {
589 maybe_transform_and_forward_to_value_deserializer!(self, deserialize_f32, visitor);
590
591 self.value.deserialize_number(visitor)
592 }
593
594 fn deserialize_f64<V>(mut self, visitor: V) -> Result<V::Value, Error>
595 where
596 V: Visitor<'de>,
597 {
598 maybe_transform_and_forward_to_value_deserializer!(self, deserialize_f64, visitor);
599
600 self.value.deserialize_number(visitor)
601 }
602
603 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Error>
604 where
605 V: Visitor<'de>,
606 {
607 self.deserialize_str(visitor)
608 }
609
610 fn deserialize_str<V>(mut self, visitor: V) -> Result<V::Value, Error>
611 where
612 V: Visitor<'de>,
613 {
614 maybe_transform_and_forward_to_value_deserializer!(self, deserialize_str, visitor);
615
616 let span = self.value.span().clone();
617 let path = self.path;
618 self.value.broadcast_end_mark();
619 maybe_why_not!(
620 self.value,
621 match self.value.untag_ref() {
622 Value::String(v, ..) => visitor.visit_borrowed_str(v),
623 other => Err(other.invalid_type(&visitor)),
624 }
625 .map_err(|e| error::set_span(e, span, path))
626 )
627 }
628
629 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Error>
630 where
631 V: Visitor<'de>,
632 {
633 self.deserialize_str(visitor)
634 }
635
636 fn deserialize_bytes<V>(mut self, visitor: V) -> Result<V::Value, Error>
637 where
638 V: Visitor<'de>,
639 {
640 maybe_transform_and_forward_to_value_deserializer!(self, deserialize_bytes, visitor);
641
642 let span = self.value.span().clone();
643 let path = self.path;
644 self.value.broadcast_end_mark();
645 maybe_why_not!(
646 self.value,
647 match self.value.untag_ref() {
648 Value::String(v, ..) => visitor.visit_borrowed_str(v),
649 Value::Sequence(v, ..) => visit_sequence_ref(
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, path))
659 )
660 }
661
662 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Error>
663 where
664 V: Visitor<'de>,
665 {
666 self.deserialize_bytes(visitor)
667 }
668
669 fn deserialize_option<V>(mut self, visitor: V) -> Result<V::Value, Error>
670 where
671 V: Visitor<'de>,
672 {
673 maybe_transform_and_forward_to_value_deserializer!(self, deserialize_option, visitor);
674
675 let span = self.value.span().clone();
676 let path = self.path;
677 maybe_why_not!(
678 self.value,
679 match self.value {
680 Value::Null(..) => visitor.visit_unit(),
681 _ => visitor.visit_some(ValueRefDeserializer::new_with_transformed(
682 self.value,
683 self.path,
684 self.unused_key_callback,
685 self.field_transformer,
686 )),
687 }
688 .map_err(|e| error::set_span(e, span, path))
689 )
690 }
691
692 fn deserialize_unit<V>(mut self, visitor: V) -> Result<V::Value, Error>
693 where
694 V: Visitor<'de>,
695 {
696 maybe_transform_and_forward_to_value_deserializer!(self, deserialize_unit, visitor);
697
698 let span = self.value.span().clone();
699 let path = self.path;
700 self.value.broadcast_end_mark();
701 maybe_why_not!(
702 self.value,
703 match self.value {
704 Value::Null(..) => visitor.visit_unit(),
705 _ => Err(self.value.invalid_type(&visitor)),
706 }
707 .map_err(|e| error::set_span(e, span, path))
708 )
709 }
710
711 fn deserialize_unit_struct<V>(
712 mut self,
713 name: &'static str,
714 visitor: V,
715 ) -> Result<V::Value, Error>
716 where
717 V: Visitor<'de>,
718 {
719 maybe_transform_and_forward_to_value_deserializer!(
720 self,
721 deserialize_unit_struct,
722 name,
723 visitor
724 );
725
726 self.deserialize_unit(visitor)
727 }
728
729 fn deserialize_newtype_struct<V>(
730 mut self,
731 name: &'static str,
732 visitor: V,
733 ) -> Result<V::Value, Error>
734 where
735 V: Visitor<'de>,
736 {
737 maybe_transform_and_forward_to_value_deserializer!(
738 self,
739 deserialize_newtype_struct,
740 name,
741 visitor
742 );
743
744 let span = self.value.span().clone();
745 let path = self.path;
746 self.value.broadcast_end_mark();
747 maybe_why_not!(
748 self.value,
749 visitor
750 .visit_newtype_struct(ValueRefDeserializer::new_with_transformed(
751 self.value,
752 self.path,
753 self.unused_key_callback,
754 self.field_transformer
755 ))
756 .map_err(|e| error::set_span(e, span, path))
757 )
758 }
759
760 fn deserialize_seq<V>(mut self, visitor: V) -> Result<V::Value, Error>
761 where
762 V: Visitor<'de>,
763 {
764 static EMPTY: Sequence = Sequence::new();
765
766 maybe_transform_and_forward_to_value_deserializer!(self, deserialize_seq, visitor);
767
768 let span = self.value.span().clone();
769 let path = self.path;
770 self.value.broadcast_end_mark();
771 maybe_why_not!(
772 self.value,
773 match self.value.untag_ref() {
774 Value::Sequence(v, ..) => visit_sequence_ref(
775 v,
776 self.path,
777 visitor,
778 self.unused_key_callback,
779 self.field_transformer,
780 ),
781 Value::Null(..) => visit_sequence_ref(
782 &EMPTY,
783 self.path,
784 visitor,
785 self.unused_key_callback,
786 self.field_transformer,
787 ),
788 other => Err(other.invalid_type(&visitor)),
789 }
790 .map_err(|e| error::set_span(e, span, path))
791 )
792 }
793
794 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error>
795 where
796 V: Visitor<'de>,
797 {
798 self.deserialize_seq(visitor)
799 }
800
801 fn deserialize_tuple_struct<V>(
802 self,
803 _name: &'static str,
804 _len: usize,
805 visitor: V,
806 ) -> Result<V::Value, Error>
807 where
808 V: Visitor<'de>,
809 {
810 self.deserialize_seq(visitor)
811 }
812
813 fn deserialize_map<V>(mut self, visitor: V) -> Result<V::Value, Error>
814 where
815 V: Visitor<'de>,
816 {
817 maybe_transform_and_forward_to_value_deserializer!(self, deserialize_map, visitor);
818
819 let span = self.value.span().clone();
820 let path = self.path;
821 self.value.broadcast_end_mark();
822 maybe_why_not!(
823 self.value,
824 match self.value.untag_ref() {
825 Value::Mapping(v, ..) => visit_mapping_ref(
826 v,
827 self.path,
828 visitor,
829 self.unused_key_callback,
830 self.field_transformer,
831 ),
832 Value::Null(..) => visitor.visit_map(&mut MapRefDeserializer::new_empty(self.path)),
833 other => Err(other.invalid_type(&visitor)),
834 }
835 .map_err(|e| error::set_span(e, span, path))
836 )
837 }
838
839 fn deserialize_struct<V>(
840 mut self,
841 name: &'static str,
842 fields: &'static [&'static str],
843 visitor: V,
844 ) -> Result<V::Value, Error>
845 where
846 V: Visitor<'de>,
847 {
848 maybe_transform_and_forward_to_value_deserializer!(
849 self,
850 deserialize_struct,
851 name,
852 fields,
853 visitor
854 );
855
856 let span = self.value.span().clone();
857 let path = self.path;
858 self.value.broadcast_end_mark();
859 maybe_why_not!(
860 self.value,
861 match self.value.untag_ref() {
862 Value::Mapping(v, ..) => visit_struct_ref(
863 v,
864 self.path,
865 visitor,
866 fields,
867 self.unused_key_callback,
868 self.field_transformer,
869 ),
870 Value::Null(..) => visitor.visit_map(&mut MapRefDeserializer::new_empty(self.path)),
871 other => Err(other.invalid_type(&visitor)),
872 }
873 .map_err(|e| error::set_span(e, span, path))
874 )
875 }
876
877 fn deserialize_enum<V>(
878 mut self,
879 name: &'static str,
880 variants: &'static [&'static str],
881 visitor: V,
882 ) -> Result<V::Value, Error>
883 where
884 V: Visitor<'de>,
885 {
886 maybe_transform_and_forward_to_value_deserializer!(
887 self,
888 deserialize_enum,
889 name,
890 variants,
891 visitor
892 );
893
894 let span = self.value.span().clone();
895 let path = self.path;
896 self.value.broadcast_end_mark();
897 maybe_why_not!(
898 self.value,
899 visitor
900 .visit_enum(match self.value {
901 Value::Tagged(tagged, ..) => EnumRefDeserializer {
902 tag: tagged::nobang(&tagged.tag.string),
903 path: self.path,
904 value: Some(&tagged.value),
905 unused_key_callback: self.unused_key_callback,
906 field_transformer: self.field_transformer,
907 },
908 Value::String(variant, ..) => EnumRefDeserializer {
909 tag: variant,
910 path: self.path,
911 value: None,
912 unused_key_callback: self.unused_key_callback,
913 field_transformer: self.field_transformer,
914 },
915 other => {
916 return Err(error::set_span(
917 Error::invalid_type(other.unexpected(), &"a Value::Tagged enum"),
918 span,
919 path,
920 ));
921 }
922 })
923 .map_err(|e| error::set_span(e, span, path))
924 )
925 }
926
927 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Error>
928 where
929 V: Visitor<'de>,
930 {
931 self.deserialize_string(visitor)
932 }
933
934 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error>
935 where
936 V: Visitor<'de>,
937 {
938 let span = self.value.span().clone();
939 let path = self.path;
940 self.value.broadcast_end_mark();
941 maybe_why_not!(
942 self.value,
943 visitor
944 .visit_unit()
945 .map_err(|e| error::set_span(e, span, path))
946 )
947 }
948}
949
950struct EnumRefDeserializer<'de, 'p, 'u, 'f> {
951 tag: &'de str,
952 path: Path<'p>,
953 value: Option<&'de Value>,
954 unused_key_callback: Option<UnusedKeyCallback<'u>>,
955 field_transformer: Option<FieldTransformer<'f>>,
956}
957
958impl<'de, 'p, 'u, 'f> EnumAccess<'de> for EnumRefDeserializer<'de, 'p, 'u, 'f> {
959 type Error = Error;
960 type Variant = VariantRefDeserializer<'de, 'p, 'u, 'f>;
961
962 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Error>
963 where
964 V: DeserializeSeed<'de>,
965 {
966 let str_de = BorrowedStrDeserializer::<Error>::new(self.tag);
967 let variant = seed.deserialize(str_de)?;
968 let visitor = VariantRefDeserializer {
969 value: self.value,
970 path: self.path,
971 unused_key_callback: self.unused_key_callback,
972 field_transformer: self.field_transformer,
973 };
974 Ok((variant, visitor))
975 }
976}
977
978struct VariantRefDeserializer<'de, 'p, 'u, 'f> {
979 value: Option<&'de Value>,
980 path: Path<'p>,
981 unused_key_callback: Option<UnusedKeyCallback<'u>>,
982 field_transformer: Option<FieldTransformer<'f>>,
983}
984
985impl<'de> VariantAccess<'de> for VariantRefDeserializer<'de, '_, '_, '_> {
986 type Error = Error;
987
988 fn unit_variant(self) -> Result<(), Error> {
989 match self.value {
990 Some(value) => value.unit_variant(),
991 None => Ok(()),
992 }
993 }
994
995 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Error>
996 where
997 T: DeserializeSeed<'de>,
998 {
999 match self.value {
1000 Some(value) => seed.deserialize(ValueRefDeserializer::new_with(
1001 value,
1002 self.path,
1003 self.unused_key_callback,
1004 self.field_transformer,
1005 )),
1006 None => Err(Error::invalid_type(
1007 Unexpected::UnitVariant,
1008 &"newtype variant",
1009 )),
1010 }
1011 }
1012
1013 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error>
1014 where
1015 V: Visitor<'de>,
1016 {
1017 match self.value {
1018 Some(Value::Sequence(v, ..)) => Deserializer::deserialize_any(
1019 SeqRefDeserializer::new_with(
1020 v,
1021 self.path,
1022 self.unused_key_callback,
1023 self.field_transformer,
1024 ),
1025 visitor,
1026 ),
1027 Some(value) => Err(Error::invalid_type(value.unexpected(), &"tuple variant")),
1028 _ => Err(Error::invalid_type(
1029 Unexpected::UnitVariant,
1030 &"tuple variant",
1031 )),
1032 }
1033 }
1034
1035 fn struct_variant<V>(
1036 self,
1037 fields: &'static [&'static str],
1038 visitor: V,
1039 ) -> Result<V::Value, Error>
1040 where
1041 V: Visitor<'de>,
1042 {
1043 match self.value {
1044 Some(Value::Mapping(v, ..)) => Deserializer::deserialize_any(
1045 StructRefDeserializer::new_with(
1046 v,
1047 self.path,
1048 fields,
1049 self.unused_key_callback,
1050 self.field_transformer,
1051 ),
1052 visitor,
1053 ),
1054 Some(value) => Err(Error::invalid_type(value.unexpected(), &"struct variant")),
1055 None => Err(Error::invalid_type(
1056 Unexpected::UnitVariant,
1057 &"struct variant",
1058 )),
1059 }
1060 }
1061}
1062
1063impl<'de> VariantAccess<'de> for ValueRefDeserializer<'de, '_, '_, '_> {
1064 type Error = Error;
1065
1066 fn unit_variant(self) -> Result<(), Error> {
1067 Deserialize::deserialize(self)
1068 }
1069
1070 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Error>
1071 where
1072 T: DeserializeSeed<'de>,
1073 {
1074 seed.deserialize(self)
1075 }
1076
1077 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error>
1078 where
1079 V: Visitor<'de>,
1080 {
1081 if let Value::Sequence(v, ..) = self.value {
1082 Deserializer::deserialize_any(
1083 SeqRefDeserializer::new_with(
1084 v,
1085 self.path,
1086 self.unused_key_callback,
1087 self.field_transformer,
1088 ),
1089 visitor,
1090 )
1091 } else {
1092 Err(Error::invalid_type(
1093 self.value.unexpected(),
1094 &"tuple variant",
1095 ))
1096 }
1097 }
1098
1099 fn struct_variant<V>(
1100 self,
1101 fields: &'static [&'static str],
1102 visitor: V,
1103 ) -> Result<V::Value, Error>
1104 where
1105 V: Visitor<'de>,
1106 {
1107 if let Value::Mapping(v, ..) = self.value {
1108 Deserializer::deserialize_any(
1109 StructRefDeserializer::new_with(
1110 v,
1111 self.path,
1112 fields,
1113 self.unused_key_callback,
1114 self.field_transformer,
1115 ),
1116 visitor,
1117 )
1118 } else {
1119 Err(Error::invalid_type(
1120 self.value.unexpected(),
1121 &"struct variant",
1122 ))
1123 }
1124 }
1125}
1126
1127pub(crate) struct SeqRefDeserializer<'de, 'p, 'u, 'f> {
1128 iter: slice::Iter<'de, Value>,
1129 path: Path<'p>,
1130 current_idx: usize,
1131 unused_key_callback: Option<UnusedKeyCallback<'u>>,
1132 field_transformer: Option<FieldTransformer<'f>>,
1133}
1134
1135impl<'de> SeqRefDeserializer<'de, '_, '_, '_> {
1136 pub(crate) fn new(slice: &'de [Value]) -> Self {
1137 SeqRefDeserializer {
1138 iter: slice.iter(),
1139 path: Path::Root,
1140 current_idx: 0,
1141 unused_key_callback: None,
1142 field_transformer: None,
1143 }
1144 }
1145}
1146
1147impl<'de, 'p, 'u, 'f> SeqRefDeserializer<'de, 'p, 'u, 'f> {
1148 pub(crate) fn new_with(
1149 slice: &'de [Value],
1150 current_path: Path<'p>,
1151 unused_key_callback: Option<UnusedKeyCallback<'u>>,
1152 field_transformer: Option<FieldTransformer<'f>>,
1153 ) -> Self {
1154 SeqRefDeserializer {
1155 iter: slice.iter(),
1156 path: current_path,
1157 current_idx: 0,
1158 unused_key_callback,
1159 field_transformer,
1160 }
1161 }
1162}
1163
1164impl<'de> Deserializer<'de> for SeqRefDeserializer<'de, '_, '_, '_> {
1165 type Error = Error;
1166
1167 #[inline]
1168 fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Error>
1169 where
1170 V: Visitor<'de>,
1171 {
1172 reset_is_deserializing_value();
1173
1174 let len = self.iter.len();
1175 if len == 0 {
1176 visitor.visit_unit()
1177 } else {
1178 let ret = visitor.visit_seq(&mut self)?;
1179 let remaining = self.iter.len();
1180 if remaining == 0 {
1181 Ok(ret)
1182 } else {
1183 Err(Error::invalid_length(len, &"fewer elements in sequence"))
1184 }
1185 }
1186 }
1187
1188 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error>
1189 where
1190 V: Visitor<'de>,
1191 {
1192 visitor.visit_unit()
1193 }
1194
1195 forward_to_deserialize_any! {
1196 bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string bytes
1197 byte_buf option unit unit_struct newtype_struct seq tuple tuple_struct
1198 map struct enum identifier
1199 }
1200}
1201
1202impl<'de> SeqAccess<'de> for SeqRefDeserializer<'de, '_, '_, '_> {
1203 type Error = Error;
1204
1205 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error>
1206 where
1207 T: DeserializeSeed<'de>,
1208 {
1209 self.current_idx += 1;
1210 match self.iter.next() {
1211 Some(value) => {
1212 let span = value.span().clone();
1213 let deserializer = ValueRefDeserializer::new_with(
1214 value,
1215 Path::Seq {
1216 parent: &self.path,
1217 index: self.current_idx - 1,
1218 },
1219 self.unused_key_callback
1220 .as_deref_mut()
1221 .map(|cb| &mut *cb as UnusedKeyCallback<'_>),
1222 self.field_transformer
1223 .as_deref_mut()
1224 .map(|ft| &mut *ft as FieldTransformer<'_>),
1225 );
1226 seed.deserialize(deserializer)
1227 .map(Some)
1228 .map_err(|e| error::set_span(e, span, self.path))
1229 }
1230 None => Ok(None),
1231 }
1232 }
1233
1234 fn size_hint(&self) -> Option<usize> {
1235 match self.iter.size_hint() {
1236 (lower, Some(upper)) if lower == upper => Some(upper),
1237 _ => None,
1238 }
1239 }
1240}
1241
1242pub(crate) struct MapRefDeserializer<'de, 'p, 'u, 'f> {
1243 iter: Option<Box<dyn Iterator<Item = (&'de Value, &'de Value)> + 'de>>,
1244 current_key: Option<String>,
1245 path: Path<'p>,
1246 value: Option<&'de Value>,
1247 unused_key_callback: Option<UnusedKeyCallback<'u>>,
1248 field_transformer: Option<FieldTransformer<'f>>,
1249}
1250
1251impl<'de> MapRefDeserializer<'de, '_, '_, '_> {
1252 pub(crate) fn new(map: &'de Mapping) -> Self {
1253 MapRefDeserializer {
1254 iter: Some(Box::new(map.iter())),
1255 current_key: None,
1256 path: Path::Root,
1257 value: None,
1258 unused_key_callback: None,
1259 field_transformer: None,
1260 }
1261 }
1262}
1263
1264impl<'de, 'p, 'u, 'f> MapRefDeserializer<'de, 'p, 'u, 'f> {
1265 pub(crate) fn new_empty(path: Path<'p>) -> Self {
1266 MapRefDeserializer {
1267 iter: None,
1268 current_key: None,
1269 path,
1270 value: None,
1271 unused_key_callback: None,
1272 field_transformer: None,
1273 }
1274 }
1275
1276 pub(crate) fn new_with(
1277 map: &'de Mapping,
1278 path: Path<'p>,
1279 unused_key_callback: Option<UnusedKeyCallback<'u>>,
1280 field_transformer: Option<FieldTransformer<'f>>,
1281 ) -> Self {
1282 MapRefDeserializer {
1283 iter: Some(Box::new(map.iter())),
1284 current_key: None,
1285 path,
1286 value: None,
1287 unused_key_callback,
1288 field_transformer,
1289 }
1290 }
1291}
1292
1293impl<'de> MapAccess<'de> for MapRefDeserializer<'de, '_, '_, '_> {
1294 type Error = Error;
1295
1296 fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error>
1297 where
1298 T: DeserializeSeed<'de>,
1299 {
1300 self.current_key = None;
1301 match self.iter.as_mut().and_then(Iterator::next) {
1302 Some((key, value)) => {
1303 self.value = Some(value);
1304 self.current_key = key.as_str().map(String::from);
1305 let deserializer = ValueRefDeserializer::new_with(key, self.path, None, None);
1306 seed.deserialize(deserializer).map(Some)
1307 }
1308 None => Ok(None),
1309 }
1310 }
1311
1312 fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Error>
1313 where
1314 T: DeserializeSeed<'de>,
1315 {
1316 match self.value.take() {
1317 Some(value) => seed.deserialize(ValueRefDeserializer::new_with(
1318 value,
1319 match self.current_key {
1320 Some(ref key) if !crate::is_flatten_key(key.as_bytes()) => Path::Map {
1321 parent: &self.path,
1322 key,
1323 },
1324 Some(_) => self.path,
1325 None => Path::Unknown { parent: &self.path },
1326 },
1327 self.unused_key_callback
1328 .as_deref_mut()
1329 .map(|cb| &mut *cb as UnusedKeyCallback<'_>),
1330 self.field_transformer
1331 .as_deref_mut()
1332 .map(|cb| &mut *cb as FieldTransformer<'_>),
1333 )),
1334 None => panic!("visit_value called before visit_key"),
1335 }
1336 }
1337
1338 fn size_hint(&self) -> Option<usize> {
1339 match self.iter.as_ref()?.size_hint() {
1340 (lower, Some(upper)) if lower == upper => Some(upper),
1341 _ => None,
1342 }
1343 }
1344}
1345
1346impl<'de> Deserializer<'de> for MapRefDeserializer<'de, '_, '_, '_> {
1347 type Error = Error;
1348
1349 #[inline]
1350 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
1351 where
1352 V: Visitor<'de>,
1353 {
1354 if super::should_short_circuit_any(self.field_transformer.is_some()) {
1355 let value = Value::mapping(
1356 self.iter
1357 .into_iter()
1358 .flatten()
1359 .map(|(key, value)| (key.clone(), value.clone()))
1360 .collect(),
1361 );
1362 unsafe {
1365 save_deserializer_state(
1366 Some(value),
1367 self.path,
1368 self.unused_key_callback,
1369 self.field_transformer,
1370 );
1371 }
1372 return Err(Error::custom("Value deserialized via fast path"));
1373 }
1374
1375 visitor.visit_map(self)
1376 }
1377
1378 fn deserialize_struct<V>(
1379 self,
1380 _name: &'static str,
1381 fields: &'static [&'static str],
1382 visitor: V,
1383 ) -> Result<V::Value, Error>
1384 where
1385 V: Visitor<'de>,
1386 {
1387 let (normal_keys, flatten_keys): (Vec<_>, Vec<_>) = fields
1388 .iter()
1389 .copied()
1390 .partition(|key| !crate::is_flatten_key(key.as_bytes()));
1391 visitor.visit_map(StructRefDeserializer {
1392 iter: self.iter,
1393 current_key: None,
1394 path: self.path,
1395 value: None,
1396 normal_keys: normal_keys.into_iter().collect(),
1397 flatten_keys,
1398 unused_key_callback: self.unused_key_callback,
1399 field_transformer: self.field_transformer,
1400 rest: Vec::new(),
1401 flatten_keys_done: 0,
1402 })
1403 }
1404
1405 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error>
1406 where
1407 V: Visitor<'de>,
1408 {
1409 visitor.visit_unit()
1410 }
1411
1412 forward_to_deserialize_any! {
1413 bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string bytes
1414 byte_buf option unit unit_struct newtype_struct seq tuple tuple_struct
1415 map enum identifier
1416 }
1417}
1418
1419pub(crate) struct StructRefDeserializer<'de, 'p, 'u, 'f> {
1420 iter: Option<Box<dyn Iterator<Item = (&'de Value, &'de Value)> + 'de>>,
1421 current_key: Option<String>,
1422 path: Path<'p>,
1423 value: Option<&'de Value>,
1424 normal_keys: HashSet<&'static str>,
1425 flatten_keys: Vec<&'static str>,
1426 unused_key_callback: Option<UnusedKeyCallback<'u>>,
1427 field_transformer: Option<FieldTransformer<'f>>,
1428 rest: Vec<(&'de Value, &'de Value)>,
1429 flatten_keys_done: usize,
1430}
1431
1432impl<'de, 'p, 'u, 'f> StructRefDeserializer<'de, 'p, 'u, 'f> {
1433 pub(crate) fn new_with(
1434 map: &'de Mapping,
1435 current_path: Path<'p>,
1436 known_keys: &'static [&'static str],
1437 unused_key_callback: Option<UnusedKeyCallback<'u>>,
1438 field_transformer: Option<FieldTransformer<'f>>,
1439 ) -> Self {
1440 let (normal_keys, flatten_keys): (Vec<_>, Vec<_>) = known_keys
1441 .iter()
1442 .copied()
1443 .partition(|key| !crate::is_flatten_key(key.as_bytes()));
1444 StructRefDeserializer {
1445 iter: Some(Box::new(map.iter())),
1446 current_key: None,
1447 path: current_path,
1448 value: None,
1449 normal_keys: normal_keys.into_iter().collect(),
1450 flatten_keys,
1451 unused_key_callback,
1452 field_transformer,
1453 rest: Vec::new(),
1454 flatten_keys_done: 0,
1455 }
1456 }
1457
1458 pub(crate) fn has_flatten(&self) -> bool {
1459 !self.flatten_keys.is_empty()
1460 }
1461
1462 fn has_unprocessed_flatten_keys(&self) -> bool {
1463 self.flatten_keys_done < self.flatten_keys.len()
1464 }
1465}
1466
1467impl<'de> MapAccess<'de> for StructRefDeserializer<'de, '_, '_, '_> {
1468 type Error = Error;
1469
1470 fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error>
1471 where
1472 T: DeserializeSeed<'de>,
1473 {
1474 self.current_key = None;
1475 loop {
1476 match self.iter.as_mut().and_then(Iterator::next) {
1477 Some((key, value)) => {
1478 match key.as_str() {
1479 Some(key_str) if crate::is_flatten_key(key_str.as_bytes()) => {
1480 self.rest.push((key, value));
1481 continue;
1482 }
1483 Some(key_str) if !self.normal_keys.contains(key_str) => {
1484 if self.has_flatten() {
1485 self.rest.push((key, value));
1486 continue;
1487 } else if let Some(callback) = &mut self.unused_key_callback {
1488 value.broadcast_end_mark();
1489 let key_string = key_str.to_string();
1490 let path = Path::Map {
1491 parent: &self.path,
1492 key: &key_string,
1493 };
1494 callback(path, key, value);
1495 continue;
1496 }
1497 }
1498 _ => {}
1499 };
1500
1501 self.current_key = key.as_str().map(|s| s.to_string());
1502 self.value = Some(value);
1503 break seed.deserialize(ValueRefDeserializer::new(key)).map(Some);
1504 }
1505 None if self.has_unprocessed_flatten_keys() => {
1506 let key = self.flatten_keys[self.flatten_keys_done];
1507 self.current_key = Some(key.to_string());
1508 break seed
1509 .deserialize(super::ValueDeserializer::new(key.into()))
1510 .map(Some);
1511 }
1512 None => break Ok(None),
1513 }
1514 }
1515 }
1516
1517 fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Error>
1518 where
1519 T: DeserializeSeed<'de>,
1520 {
1521 match self.value.take() {
1522 Some(value) => seed.deserialize(ValueRefDeserializer::new_with(
1523 value,
1524 match self.current_key {
1525 Some(ref key) => Path::Map {
1526 parent: &self.path,
1527 key,
1528 },
1529 None => Path::Unknown { parent: &self.path },
1530 },
1531 self.unused_key_callback
1532 .as_deref_mut()
1533 .map(|cb| &mut *cb as UnusedKeyCallback<'_>),
1534 self.field_transformer
1535 .as_deref_mut()
1536 .map(|cb| &mut *cb as FieldTransformer<'_>),
1537 )),
1538 None if self.has_unprocessed_flatten_keys() => {
1539 self.flatten_keys_done += 1;
1540
1541 let flattened = self.rest.drain(..).collect::<Vec<_>>();
1542 let path = self.path;
1544
1545 if self.has_unprocessed_flatten_keys() {
1546 let deserializer = FlattenRefDeserializer::new(
1547 Some(Box::new(flattened.into_iter())),
1548 path,
1549 &mut self.rest,
1550 self.field_transformer
1551 .as_deref_mut()
1552 .map(|cb| &mut *cb as FieldTransformer<'_>),
1553 );
1554
1555 seed.deserialize(deserializer)
1556 } else {
1557 let deserializer = MapRefDeserializer {
1558 iter: Some(Box::new(flattened.into_iter())),
1559 current_key: None,
1560 path,
1561 value: None,
1562 unused_key_callback: self
1563 .unused_key_callback
1564 .as_deref_mut()
1565 .map(|cb| &mut *cb as UnusedKeyCallback<'_>),
1566 field_transformer: self
1567 .field_transformer
1568 .as_deref_mut()
1569 .map(|cb| &mut *cb as FieldTransformer<'_>),
1570 };
1571 seed.deserialize(deserializer)
1572 }
1573 }
1574 None => panic!("visit_value called before visit_key"),
1575 }
1576 }
1577
1578 fn size_hint(&self) -> Option<usize> {
1579 match self.iter.as_ref()?.size_hint() {
1580 (lower, Some(upper)) if lower == upper => Some(upper),
1581 _ => None,
1582 }
1583 }
1584}
1585
1586impl<'de> Deserializer<'de> for StructRefDeserializer<'de, '_, '_, '_> {
1587 type Error = Error;
1588
1589 #[inline]
1590 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
1591 where
1592 V: Visitor<'de>,
1593 {
1594 reset_is_deserializing_value();
1595 visitor.visit_map(self)
1596 }
1597
1598 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error>
1599 where
1600 V: Visitor<'de>,
1601 {
1602 drop(self);
1603 visitor.visit_unit()
1604 }
1605
1606 forward_to_deserialize_any! {
1607 bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string bytes
1608 byte_buf option unit unit_struct newtype_struct seq tuple tuple_struct
1609 map struct enum identifier
1610 }
1611}
1612
1613struct FlattenRefDeserializer<'de, 'p, 'r, 'f> {
1614 iter: Option<Box<dyn Iterator<Item = (&'de Value, &'de Value)> + 'de>>,
1615 path: Path<'p>,
1616 remaining: &'r mut Vec<(&'de Value, &'de Value)>,
1617 field_transformer: Option<FieldTransformer<'f>>,
1618}
1619
1620impl<'de, 'p, 'r, 'f> FlattenRefDeserializer<'de, 'p, 'r, 'f> {
1621 pub(crate) fn new(
1622 iter: Option<Box<dyn Iterator<Item = (&'de Value, &'de Value)> + 'de>>,
1623 current_path: Path<'p>,
1624 remaining: &'r mut Vec<(&'de Value, &'de Value)>,
1625 field_transformer: Option<FieldTransformer<'f>>,
1626 ) -> Self {
1627 FlattenRefDeserializer {
1628 iter,
1629 path: current_path,
1630 remaining,
1631 field_transformer,
1632 }
1633 }
1634}
1635
1636impl<'de> Deserializer<'de> for FlattenRefDeserializer<'de, '_, '_, '_> {
1637 type Error = Error;
1638
1639 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
1640 where
1641 V: Visitor<'de>,
1642 {
1643 let mut collect_unused = move |_: Path<'_>, key: &Value, value: &Value| {
1644 let key: &'de Value = unsafe { std::mem::transmute(key) };
1647 let value: &'de Value = unsafe { std::mem::transmute(value) };
1648 self.remaining.push((key, value));
1649 };
1650
1651 if super::should_short_circuit_any(self.field_transformer.is_some()) {
1652 let value = Value::mapping(
1653 self.iter
1654 .into_iter()
1655 .flatten()
1656 .map(|(key, value)| (key.clone(), value.clone()))
1657 .collect(),
1658 );
1659 unsafe {
1660 save_deserializer_state(
1661 Some(value),
1662 self.path,
1663 None,
1666 self.field_transformer,
1667 );
1668 }
1669 return Err(Error::custom("Value deserialized via fast path"));
1670 }
1671
1672 let deserializer = MapRefDeserializer {
1673 iter: self.iter,
1674 current_key: None,
1675 path: self.path,
1676 value: None,
1677 unused_key_callback: Some(&mut collect_unused),
1678 field_transformer: self.field_transformer,
1679 };
1680 visitor.visit_map(deserializer)
1681 }
1682
1683 fn deserialize_struct<V>(
1684 self,
1685 _name: &'static str,
1686 fields: &'static [&'static str],
1687 visitor: V,
1688 ) -> Result<V::Value, Error>
1689 where
1690 V: Visitor<'de>,
1691 {
1692 let mut collect_unused = |_: Path<'_>, key: &Value, value: &Value| {
1693 let key: &'de Value = unsafe { std::mem::transmute(key) };
1696 let value: &'de Value = unsafe { std::mem::transmute(value) };
1697 self.remaining.push((key, value));
1698 };
1699
1700 let (normal_keys, flatten_keys): (Vec<_>, Vec<_>) = fields
1701 .iter()
1702 .copied()
1703 .partition(|key| !crate::is_flatten_key(key.as_bytes()));
1704 let deserializer = StructRefDeserializer {
1705 iter: self.iter,
1706 current_key: None,
1707 path: self.path,
1708 value: None,
1709 normal_keys: normal_keys.into_iter().collect(),
1710 flatten_keys,
1711 unused_key_callback: Some(&mut collect_unused),
1712 field_transformer: self.field_transformer,
1713 rest: Vec::new(),
1714 flatten_keys_done: 0,
1715 };
1716 visitor.visit_map(deserializer)
1717 }
1718
1719 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error>
1720 where
1721 V: Visitor<'de>,
1722 {
1723 drop(self);
1724 visitor.visit_unit()
1725 }
1726
1727 forward_to_deserialize_any! {
1728 bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string bytes
1729 byte_buf option unit unit_struct newtype_struct seq tuple tuple_struct
1730 map enum identifier
1731 }
1732}