1use crate::any::Any;
2use crate::error::{erase_de as erase, unerase_de as unerase, Error};
3use crate::map::{OptionExt, ResultExt};
4use crate::sealed::deserializer::Sealed;
5use alloc::boxed::Box;
6#[cfg(feature = "alloc")]
7use alloc::string::String;
8#[cfg(feature = "alloc")]
9use alloc::vec::Vec;
10use core::fmt;
11
12pub fn deserialize<'de, T>(deserializer: &mut dyn Deserializer<'de>) -> Result<T, Error>
41where
42 T: serde::Deserialize<'de>,
43{
44 serde::Deserialize::deserialize(deserializer)
45}
46
47pub trait DeserializeSeed<'de> {
50 fn erased_deserialize_seed(
51 &mut self,
52 deserializer: &mut dyn Deserializer<'de>,
53 ) -> Result<Out, Error>;
54}
55
56pub trait Deserializer<'de>: Sealed {
92 fn erased_deserialize_any(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error>;
93 fn erased_deserialize_bool(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error>;
94 fn erased_deserialize_i8(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error>;
95 fn erased_deserialize_i16(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error>;
96 fn erased_deserialize_i32(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error>;
97 fn erased_deserialize_i64(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error>;
98 fn erased_deserialize_i128(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error>;
99 fn erased_deserialize_u8(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error>;
100 fn erased_deserialize_u16(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error>;
101 fn erased_deserialize_u32(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error>;
102 fn erased_deserialize_u64(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error>;
103 fn erased_deserialize_u128(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error>;
104 fn erased_deserialize_f32(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error>;
105 fn erased_deserialize_f64(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error>;
106 fn erased_deserialize_char(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error>;
107 fn erased_deserialize_str(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error>;
108 fn erased_deserialize_string(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error>;
109 fn erased_deserialize_bytes(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error>;
110 fn erased_deserialize_byte_buf(&mut self, visitor: &mut dyn Visitor<'de>)
111 -> Result<Out, Error>;
112 fn erased_deserialize_option(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error>;
113 fn erased_deserialize_unit(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error>;
114 fn erased_deserialize_unit_struct(
115 &mut self,
116 name: &'static str,
117 visitor: &mut dyn Visitor<'de>,
118 ) -> Result<Out, Error>;
119 fn erased_deserialize_newtype_struct(
120 &mut self,
121 name: &'static str,
122 visitor: &mut dyn Visitor<'de>,
123 ) -> Result<Out, Error>;
124 fn erased_deserialize_seq(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error>;
125 fn erased_deserialize_tuple(
126 &mut self,
127 len: usize,
128 visitor: &mut dyn Visitor<'de>,
129 ) -> Result<Out, Error>;
130 fn erased_deserialize_tuple_struct(
131 &mut self,
132 name: &'static str,
133 len: usize,
134 visitor: &mut dyn Visitor<'de>,
135 ) -> Result<Out, Error>;
136 fn erased_deserialize_map(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error>;
137 fn erased_deserialize_struct(
138 &mut self,
139 name: &'static str,
140 fields: &'static [&'static str],
141 visitor: &mut dyn Visitor<'de>,
142 ) -> Result<Out, Error>;
143 fn erased_deserialize_identifier(
144 &mut self,
145 visitor: &mut dyn Visitor<'de>,
146 ) -> Result<Out, Error>;
147 fn erased_deserialize_enum(
148 &mut self,
149 name: &'static str,
150 variants: &'static [&'static str],
151 visitor: &mut dyn Visitor<'de>,
152 ) -> Result<Out, Error>;
153 fn erased_deserialize_ignored_any(
154 &mut self,
155 visitor: &mut dyn Visitor<'de>,
156 ) -> Result<Out, Error>;
157 fn erased_is_human_readable(&self) -> bool;
158}
159
160pub trait Visitor<'de> {
161 fn erased_expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result;
162 fn erased_visit_bool(&mut self, v: bool) -> Result<Out, Error>;
163 fn erased_visit_i8(&mut self, v: i8) -> Result<Out, Error>;
164 fn erased_visit_i16(&mut self, v: i16) -> Result<Out, Error>;
165 fn erased_visit_i32(&mut self, v: i32) -> Result<Out, Error>;
166 fn erased_visit_i64(&mut self, v: i64) -> Result<Out, Error>;
167 fn erased_visit_i128(&mut self, v: i128) -> Result<Out, Error>;
168 fn erased_visit_u8(&mut self, v: u8) -> Result<Out, Error>;
169 fn erased_visit_u16(&mut self, v: u16) -> Result<Out, Error>;
170 fn erased_visit_u32(&mut self, v: u32) -> Result<Out, Error>;
171 fn erased_visit_u64(&mut self, v: u64) -> Result<Out, Error>;
172 fn erased_visit_u128(&mut self, v: u128) -> Result<Out, Error>;
173 fn erased_visit_f32(&mut self, v: f32) -> Result<Out, Error>;
174 fn erased_visit_f64(&mut self, v: f64) -> Result<Out, Error>;
175 fn erased_visit_char(&mut self, v: char) -> Result<Out, Error>;
176 fn erased_visit_str(&mut self, v: &str) -> Result<Out, Error>;
177 fn erased_visit_borrowed_str(&mut self, v: &'de str) -> Result<Out, Error>;
178 #[cfg(feature = "alloc")]
179 fn erased_visit_string(&mut self, v: String) -> Result<Out, Error>;
180 fn erased_visit_bytes(&mut self, v: &[u8]) -> Result<Out, Error>;
181 fn erased_visit_borrowed_bytes(&mut self, v: &'de [u8]) -> Result<Out, Error>;
182 #[cfg(feature = "alloc")]
183 fn erased_visit_byte_buf(&mut self, v: Vec<u8>) -> Result<Out, Error>;
184 fn erased_visit_none(&mut self) -> Result<Out, Error>;
185 fn erased_visit_some(&mut self, deserializer: &mut dyn Deserializer<'de>)
186 -> Result<Out, Error>;
187 fn erased_visit_unit(&mut self) -> Result<Out, Error>;
188 fn erased_visit_newtype_struct(
189 &mut self,
190 deserializer: &mut dyn Deserializer<'de>,
191 ) -> Result<Out, Error>;
192 fn erased_visit_seq(&mut self, seq: &mut dyn SeqAccess<'de>) -> Result<Out, Error>;
193 fn erased_visit_map(&mut self, map: &mut dyn MapAccess<'de>) -> Result<Out, Error>;
194 fn erased_visit_enum(&mut self, data: &mut dyn EnumAccess<'de>) -> Result<Out, Error>;
195}
196
197pub trait SeqAccess<'de> {
198 fn erased_next_element(
199 &mut self,
200 seed: &mut dyn DeserializeSeed<'de>,
201 ) -> Result<Option<Out>, Error>;
202 fn erased_size_hint(&self) -> Option<usize>;
203}
204
205pub trait MapAccess<'de> {
206 fn erased_next_key(
207 &mut self,
208 seed: &mut dyn DeserializeSeed<'de>,
209 ) -> Result<Option<Out>, Error>;
210 fn erased_next_value(&mut self, seed: &mut dyn DeserializeSeed<'de>) -> Result<Out, Error>;
211 fn erased_next_entry(
212 &mut self,
213 key: &mut dyn DeserializeSeed<'de>,
214 value: &mut dyn DeserializeSeed<'de>,
215 ) -> Result<Option<(Out, Out)>, Error>;
216 fn erased_size_hint(&self) -> Option<usize>;
217}
218
219pub trait EnumAccess<'de> {
220 fn erased_variant_seed(
221 &mut self,
222 seed: &mut dyn DeserializeSeed<'de>,
223 ) -> Result<(Out, Variant<'de>), Error>;
224}
225
226impl<'de> dyn Deserializer<'de> {
227 pub fn erase<D>(deserializer: D) -> impl Deserializer<'de>
256 where
257 D: serde::Deserializer<'de>,
258 {
259 erase::Deserializer::new(deserializer)
260 }
261}
262
263pub struct Out(Any);
266
267impl Out {
268 unsafe fn new<T>(t: T) -> Self {
269 Out(unsafe { Any::new(t) })
270 }
271
272 unsafe fn take<T>(self) -> T {
273 unsafe { self.0.take() }
274 }
275}
276
277mod erase {
280 pub struct DeserializeSeed<D> {
281 state: Option<D>,
282 }
283
284 impl<D> DeserializeSeed<D> {
285 pub(crate) fn new(seed: D) -> Self {
286 DeserializeSeed { state: Some(seed) }
287 }
288
289 pub(crate) fn take(&mut self) -> D {
290 self.state.take().unwrap()
291 }
292 }
293
294 pub struct Deserializer<D> {
295 state: Option<D>,
296 }
297
298 impl<D> Deserializer<D> {
299 pub(crate) fn new(deserializer: D) -> Self {
300 Deserializer {
301 state: Some(deserializer),
302 }
303 }
304
305 pub(crate) fn take(&mut self) -> D {
306 self.state.take().unwrap()
307 }
308
309 pub(crate) fn as_ref(&self) -> &D {
310 self.state.as_ref().unwrap()
311 }
312 }
313
314 pub struct Visitor<D> {
315 state: Option<D>,
316 }
317
318 impl<D> Visitor<D> {
319 pub(crate) fn new(visitor: D) -> Self {
320 Visitor {
321 state: Some(visitor),
322 }
323 }
324
325 pub(crate) fn take(&mut self) -> D {
326 self.state.take().unwrap()
327 }
328
329 pub(crate) fn as_ref(&self) -> &D {
330 self.state.as_ref().unwrap()
331 }
332 }
333
334 pub struct SeqAccess<D> {
335 state: D,
336 }
337
338 impl<D> SeqAccess<D> {
339 pub(crate) fn new(seq_access: D) -> Self {
340 SeqAccess { state: seq_access }
341 }
342
343 pub(crate) fn as_ref(&self) -> &D {
344 &self.state
345 }
346
347 pub(crate) fn as_mut(&mut self) -> &mut D {
348 &mut self.state
349 }
350 }
351
352 pub struct MapAccess<D> {
353 state: D,
354 }
355
356 impl<D> MapAccess<D> {
357 pub(crate) fn new(map_access: D) -> Self {
358 MapAccess { state: map_access }
359 }
360
361 pub(crate) fn as_ref(&self) -> &D {
362 &self.state
363 }
364
365 pub(crate) fn as_mut(&mut self) -> &mut D {
366 &mut self.state
367 }
368 }
369
370 pub struct EnumAccess<D> {
371 state: Option<D>,
372 }
373
374 impl<D> EnumAccess<D> {
375 pub(crate) fn new(enum_access: D) -> Self {
376 EnumAccess {
377 state: Some(enum_access),
378 }
379 }
380
381 pub(crate) fn take(&mut self) -> D {
382 self.state.take().unwrap()
383 }
384 }
385}
386
387impl<'de, T> DeserializeSeed<'de> for erase::DeserializeSeed<T>
388where
389 T: serde::de::DeserializeSeed<'de>,
390{
391 fn erased_deserialize_seed(
392 &mut self,
393 deserializer: &mut dyn Deserializer<'de>,
394 ) -> Result<Out, Error> {
395 unsafe { self.take().deserialize(deserializer).unsafe_map(Out::new) }
396 }
397}
398
399impl<'de, T> Deserializer<'de> for erase::Deserializer<T>
400where
401 T: serde::Deserializer<'de>,
402{
403 fn erased_deserialize_any(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
404 self.take().deserialize_any(visitor).map_err(erase)
405 }
406
407 fn erased_deserialize_bool(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
408 self.take().deserialize_bool(visitor).map_err(erase)
409 }
410
411 fn erased_deserialize_i8(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
412 self.take().deserialize_i8(visitor).map_err(erase)
413 }
414
415 fn erased_deserialize_i16(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
416 self.take().deserialize_i16(visitor).map_err(erase)
417 }
418
419 fn erased_deserialize_i32(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
420 self.take().deserialize_i32(visitor).map_err(erase)
421 }
422
423 fn erased_deserialize_i64(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
424 self.take().deserialize_i64(visitor).map_err(erase)
425 }
426
427 fn erased_deserialize_i128(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
428 self.take().deserialize_i128(visitor).map_err(erase)
429 }
430
431 fn erased_deserialize_u8(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
432 self.take().deserialize_u8(visitor).map_err(erase)
433 }
434
435 fn erased_deserialize_u16(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
436 self.take().deserialize_u16(visitor).map_err(erase)
437 }
438
439 fn erased_deserialize_u32(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
440 self.take().deserialize_u32(visitor).map_err(erase)
441 }
442
443 fn erased_deserialize_u64(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
444 self.take().deserialize_u64(visitor).map_err(erase)
445 }
446
447 fn erased_deserialize_u128(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
448 self.take().deserialize_u128(visitor).map_err(erase)
449 }
450
451 fn erased_deserialize_f32(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
452 self.take().deserialize_f32(visitor).map_err(erase)
453 }
454
455 fn erased_deserialize_f64(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
456 self.take().deserialize_f64(visitor).map_err(erase)
457 }
458
459 fn erased_deserialize_char(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
460 self.take().deserialize_char(visitor).map_err(erase)
461 }
462
463 fn erased_deserialize_str(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
464 self.take().deserialize_str(visitor).map_err(erase)
465 }
466
467 fn erased_deserialize_string(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
468 self.take().deserialize_string(visitor).map_err(erase)
469 }
470
471 fn erased_deserialize_bytes(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
472 self.take().deserialize_bytes(visitor).map_err(erase)
473 }
474
475 fn erased_deserialize_byte_buf(
476 &mut self,
477 visitor: &mut dyn Visitor<'de>,
478 ) -> Result<Out, Error> {
479 self.take().deserialize_byte_buf(visitor).map_err(erase)
480 }
481
482 fn erased_deserialize_option(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
483 self.take().deserialize_option(visitor).map_err(erase)
484 }
485
486 fn erased_deserialize_unit(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
487 self.take().deserialize_unit(visitor).map_err(erase)
488 }
489
490 fn erased_deserialize_unit_struct(
491 &mut self,
492 name: &'static str,
493 visitor: &mut dyn Visitor<'de>,
494 ) -> Result<Out, Error> {
495 self.take()
496 .deserialize_unit_struct(name, visitor)
497 .map_err(erase)
498 }
499
500 fn erased_deserialize_newtype_struct(
501 &mut self,
502 name: &'static str,
503 visitor: &mut dyn Visitor<'de>,
504 ) -> Result<Out, Error> {
505 self.take()
506 .deserialize_newtype_struct(name, visitor)
507 .map_err(erase)
508 }
509
510 fn erased_deserialize_seq(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
511 self.take().deserialize_seq(visitor).map_err(erase)
512 }
513
514 fn erased_deserialize_tuple(
515 &mut self,
516 len: usize,
517 visitor: &mut dyn Visitor<'de>,
518 ) -> Result<Out, Error> {
519 self.take().deserialize_tuple(len, visitor).map_err(erase)
520 }
521
522 fn erased_deserialize_tuple_struct(
523 &mut self,
524 name: &'static str,
525 len: usize,
526 visitor: &mut dyn Visitor<'de>,
527 ) -> Result<Out, Error> {
528 self.take()
529 .deserialize_tuple_struct(name, len, visitor)
530 .map_err(erase)
531 }
532
533 fn erased_deserialize_map(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
534 self.take().deserialize_map(visitor).map_err(erase)
535 }
536
537 fn erased_deserialize_struct(
538 &mut self,
539 name: &'static str,
540 fields: &'static [&'static str],
541 visitor: &mut dyn Visitor<'de>,
542 ) -> Result<Out, Error> {
543 self.take()
544 .deserialize_struct(name, fields, visitor)
545 .map_err(erase)
546 }
547
548 fn erased_deserialize_identifier(
549 &mut self,
550 visitor: &mut dyn Visitor<'de>,
551 ) -> Result<Out, Error> {
552 self.take().deserialize_identifier(visitor).map_err(erase)
553 }
554
555 fn erased_deserialize_enum(
556 &mut self,
557 name: &'static str,
558 variants: &'static [&'static str],
559 visitor: &mut dyn Visitor<'de>,
560 ) -> Result<Out, Error> {
561 self.take()
562 .deserialize_enum(name, variants, visitor)
563 .map_err(erase)
564 }
565
566 fn erased_deserialize_ignored_any(
567 &mut self,
568 visitor: &mut dyn Visitor<'de>,
569 ) -> Result<Out, Error> {
570 self.take().deserialize_ignored_any(visitor).map_err(erase)
571 }
572
573 fn erased_is_human_readable(&self) -> bool {
574 self.as_ref().is_human_readable()
575 }
576}
577
578impl<'de, T> Sealed for erase::Deserializer<T> where T: serde::Deserializer<'de> {}
579
580impl<'de, T> Visitor<'de> for erase::Visitor<T>
581where
582 T: serde::de::Visitor<'de>,
583{
584 fn erased_expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
585 self.as_ref().expecting(formatter)
586 }
587
588 fn erased_visit_bool(&mut self, v: bool) -> Result<Out, Error> {
589 unsafe { self.take().visit_bool(v).unsafe_map(Out::new) }
590 }
591
592 fn erased_visit_i8(&mut self, v: i8) -> Result<Out, Error> {
593 unsafe { self.take().visit_i8(v).unsafe_map(Out::new) }
594 }
595
596 fn erased_visit_i16(&mut self, v: i16) -> Result<Out, Error> {
597 unsafe { self.take().visit_i16(v).unsafe_map(Out::new) }
598 }
599
600 fn erased_visit_i32(&mut self, v: i32) -> Result<Out, Error> {
601 unsafe { self.take().visit_i32(v).unsafe_map(Out::new) }
602 }
603
604 fn erased_visit_i64(&mut self, v: i64) -> Result<Out, Error> {
605 unsafe { self.take().visit_i64(v).unsafe_map(Out::new) }
606 }
607
608 fn erased_visit_i128(&mut self, v: i128) -> Result<Out, Error> {
609 unsafe { self.take().visit_i128(v).unsafe_map(Out::new) }
610 }
611
612 fn erased_visit_u8(&mut self, v: u8) -> Result<Out, Error> {
613 unsafe { self.take().visit_u8(v).unsafe_map(Out::new) }
614 }
615
616 fn erased_visit_u16(&mut self, v: u16) -> Result<Out, Error> {
617 unsafe { self.take().visit_u16(v).unsafe_map(Out::new) }
618 }
619
620 fn erased_visit_u32(&mut self, v: u32) -> Result<Out, Error> {
621 unsafe { self.take().visit_u32(v).unsafe_map(Out::new) }
622 }
623
624 fn erased_visit_u64(&mut self, v: u64) -> Result<Out, Error> {
625 unsafe { self.take().visit_u64(v).unsafe_map(Out::new) }
626 }
627
628 fn erased_visit_u128(&mut self, v: u128) -> Result<Out, Error> {
629 unsafe { self.take().visit_u128(v).unsafe_map(Out::new) }
630 }
631
632 fn erased_visit_f32(&mut self, v: f32) -> Result<Out, Error> {
633 unsafe { self.take().visit_f32(v).unsafe_map(Out::new) }
634 }
635
636 fn erased_visit_f64(&mut self, v: f64) -> Result<Out, Error> {
637 unsafe { self.take().visit_f64(v).unsafe_map(Out::new) }
638 }
639
640 fn erased_visit_char(&mut self, v: char) -> Result<Out, Error> {
641 unsafe { self.take().visit_char(v).unsafe_map(Out::new) }
642 }
643
644 fn erased_visit_str(&mut self, v: &str) -> Result<Out, Error> {
645 unsafe { self.take().visit_str(v).unsafe_map(Out::new) }
646 }
647
648 fn erased_visit_borrowed_str(&mut self, v: &'de str) -> Result<Out, Error> {
649 unsafe { self.take().visit_borrowed_str(v).unsafe_map(Out::new) }
650 }
651
652 #[cfg(feature = "alloc")]
653 fn erased_visit_string(&mut self, v: String) -> Result<Out, Error> {
654 unsafe { self.take().visit_string(v).unsafe_map(Out::new) }
655 }
656
657 fn erased_visit_bytes(&mut self, v: &[u8]) -> Result<Out, Error> {
658 unsafe { self.take().visit_bytes(v).unsafe_map(Out::new) }
659 }
660
661 fn erased_visit_borrowed_bytes(&mut self, v: &'de [u8]) -> Result<Out, Error> {
662 unsafe { self.take().visit_borrowed_bytes(v).unsafe_map(Out::new) }
663 }
664
665 #[cfg(feature = "alloc")]
666 fn erased_visit_byte_buf(&mut self, v: Vec<u8>) -> Result<Out, Error> {
667 unsafe { self.take().visit_byte_buf(v).unsafe_map(Out::new) }
668 }
669
670 fn erased_visit_none(&mut self) -> Result<Out, Error> {
671 unsafe { self.take().visit_none().unsafe_map(Out::new) }
672 }
673
674 fn erased_visit_some(
675 &mut self,
676 deserializer: &mut dyn Deserializer<'de>,
677 ) -> Result<Out, Error> {
678 unsafe { self.take().visit_some(deserializer).unsafe_map(Out::new) }
679 }
680
681 fn erased_visit_unit(&mut self) -> Result<Out, Error> {
682 unsafe { self.take().visit_unit().unsafe_map(Out::new) }
683 }
684
685 fn erased_visit_newtype_struct(
686 &mut self,
687 deserializer: &mut dyn Deserializer<'de>,
688 ) -> Result<Out, Error> {
689 unsafe {
690 self.take()
691 .visit_newtype_struct(deserializer)
692 .unsafe_map(Out::new)
693 }
694 }
695
696 fn erased_visit_seq(&mut self, seq: &mut dyn SeqAccess<'de>) -> Result<Out, Error> {
697 unsafe { self.take().visit_seq(seq).unsafe_map(Out::new) }
698 }
699
700 fn erased_visit_map(&mut self, map: &mut dyn MapAccess<'de>) -> Result<Out, Error> {
701 unsafe { self.take().visit_map(map).unsafe_map(Out::new) }
702 }
703
704 fn erased_visit_enum(&mut self, data: &mut dyn EnumAccess<'de>) -> Result<Out, Error> {
705 unsafe { self.take().visit_enum(data).unsafe_map(Out::new) }
706 }
707}
708
709impl<'de, T> SeqAccess<'de> for erase::SeqAccess<T>
710where
711 T: serde::de::SeqAccess<'de>,
712{
713 fn erased_next_element(
714 &mut self,
715 seed: &mut dyn DeserializeSeed<'de>,
716 ) -> Result<Option<Out>, Error> {
717 self.as_mut().next_element_seed(seed).map_err(erase)
718 }
719
720 fn erased_size_hint(&self) -> Option<usize> {
721 self.as_ref().size_hint()
722 }
723}
724
725impl<'de, T> MapAccess<'de> for erase::MapAccess<T>
726where
727 T: serde::de::MapAccess<'de>,
728{
729 fn erased_next_key(
730 &mut self,
731 seed: &mut dyn DeserializeSeed<'de>,
732 ) -> Result<Option<Out>, Error> {
733 self.as_mut().next_key_seed(seed).map_err(erase)
734 }
735
736 fn erased_next_value(&mut self, seed: &mut dyn DeserializeSeed<'de>) -> Result<Out, Error> {
737 self.as_mut().next_value_seed(seed).map_err(erase)
738 }
739
740 fn erased_next_entry(
741 &mut self,
742 kseed: &mut dyn DeserializeSeed<'de>,
743 vseed: &mut dyn DeserializeSeed<'de>,
744 ) -> Result<Option<(Out, Out)>, Error> {
745 self.as_mut().next_entry_seed(kseed, vseed).map_err(erase)
746 }
747
748 fn erased_size_hint(&self) -> Option<usize> {
749 self.as_ref().size_hint()
750 }
751}
752
753impl<'de, T> EnumAccess<'de> for erase::EnumAccess<T>
754where
755 T: serde::de::EnumAccess<'de>,
756{
757 fn erased_variant_seed(
758 &mut self,
759 seed: &mut dyn DeserializeSeed<'de>,
760 ) -> Result<(Out, Variant<'de>), Error> {
761 self.take()
762 .variant_seed(seed)
763 .map(|(out, variant)| {
764 use serde::de::VariantAccess;
765 let erased = Variant {
766 data: unsafe { Any::new(variant) },
767 unit_variant: {
768 unsafe fn unit_variant<'de, T>(a: Any) -> Result<(), Error>
769 where
770 T: serde::de::EnumAccess<'de>,
771 {
772 unsafe { a.take::<T::Variant>().unit_variant().map_err(erase) }
773 }
774 unit_variant::<T>
775 },
776 visit_newtype: {
777 unsafe fn visit_newtype<'de, T>(
778 a: Any,
779 seed: &mut dyn DeserializeSeed<'de>,
780 ) -> Result<Out, Error>
781 where
782 T: serde::de::EnumAccess<'de>,
783 {
784 unsafe {
785 a.take::<T::Variant>()
786 .newtype_variant_seed(seed)
787 .map_err(erase)
788 }
789 }
790 visit_newtype::<T>
791 },
792 tuple_variant: {
793 unsafe fn tuple_variant<'de, T>(
794 a: Any,
795 len: usize,
796 visitor: &mut dyn Visitor<'de>,
797 ) -> Result<Out, Error>
798 where
799 T: serde::de::EnumAccess<'de>,
800 {
801 unsafe {
802 a.take::<T::Variant>()
803 .tuple_variant(len, visitor)
804 .map_err(erase)
805 }
806 }
807 tuple_variant::<T>
808 },
809 struct_variant: {
810 unsafe fn struct_variant<'de, T>(
811 a: Any,
812 fields: &'static [&'static str],
813 visitor: &mut dyn Visitor<'de>,
814 ) -> Result<Out, Error>
815 where
816 T: serde::de::EnumAccess<'de>,
817 {
818 unsafe {
819 a.take::<T::Variant>()
820 .struct_variant(fields, visitor)
821 .map_err(erase)
822 }
823 }
824 struct_variant::<T>
825 },
826 };
827 (out, erased)
828 })
829 .map_err(erase)
830 }
831}
832
833impl<'de> serde::de::DeserializeSeed<'de> for &mut (dyn DeserializeSeed<'de> + '_) {
836 type Value = Out;
837 fn deserialize<D>(self, deserializer: D) -> Result<Out, D::Error>
838 where
839 D: serde::Deserializer<'de>,
840 {
841 let mut erased = erase::Deserializer::new(deserializer);
842 self.erased_deserialize_seed(&mut erased).map_err(unerase)
843 }
844}
845
846macro_rules! impl_deserializer_for_trait_object {
847 ({$($mut:tt)*} $ty:ty) => {
848 impl<'de> serde::Deserializer<'de> for $ty {
849 type Error = Error;
850
851 fn deserialize_any<V>($($mut)* self, visitor: V) -> Result<V::Value, Error>
852 where
853 V: serde::de::Visitor<'de>,
854 {
855 let mut erased = erase::Visitor::new(visitor);
856 unsafe { self.erased_deserialize_any(&mut erased).unsafe_map(Out::take) }
857 }
858
859 fn deserialize_bool<V>($($mut)* self, visitor: V) -> Result<V::Value, Error>
860 where
861 V: serde::de::Visitor<'de>,
862 {
863 let mut erased = erase::Visitor::new(visitor);
864 unsafe { self.erased_deserialize_bool(&mut erased).unsafe_map(Out::take) }
865 }
866
867 fn deserialize_i8<V>($($mut)* self, visitor: V) -> Result<V::Value, Error>
868 where
869 V: serde::de::Visitor<'de>,
870 {
871 let mut erased = erase::Visitor::new(visitor);
872 unsafe { self.erased_deserialize_i8(&mut erased).unsafe_map(Out::take) }
873 }
874
875 fn deserialize_i16<V>($($mut)* self, visitor: V) -> Result<V::Value, Error>
876 where
877 V: serde::de::Visitor<'de>,
878 {
879 let mut erased = erase::Visitor::new(visitor);
880 unsafe { self.erased_deserialize_i16(&mut erased).unsafe_map(Out::take) }
881 }
882
883 fn deserialize_i32<V>($($mut)* self, visitor: V) -> Result<V::Value, Error>
884 where
885 V: serde::de::Visitor<'de>,
886 {
887 let mut erased = erase::Visitor::new(visitor);
888 unsafe { self.erased_deserialize_i32(&mut erased).unsafe_map(Out::take) }
889 }
890
891 fn deserialize_i64<V>($($mut)* self, visitor: V) -> Result<V::Value, Error>
892 where
893 V: serde::de::Visitor<'de>,
894 {
895 let mut erased = erase::Visitor::new(visitor);
896 unsafe { self.erased_deserialize_i64(&mut erased).unsafe_map(Out::take) }
897 }
898
899 fn deserialize_i128<V>($($mut)* self, visitor: V) -> Result<V::Value, Error>
900 where
901 V: serde::de::Visitor<'de>,
902 {
903 let mut erased = erase::Visitor::new(visitor);
904 unsafe { self.erased_deserialize_i128(&mut erased).unsafe_map(Out::take) }
905 }
906
907 fn deserialize_u8<V>($($mut)* self, visitor: V) -> Result<V::Value, Error>
908 where
909 V: serde::de::Visitor<'de>,
910 {
911 let mut erased = erase::Visitor::new(visitor);
912 unsafe { self.erased_deserialize_u8(&mut erased).unsafe_map(Out::take) }
913 }
914
915 fn deserialize_u16<V>($($mut)* self, visitor: V) -> Result<V::Value, Error>
916 where
917 V: serde::de::Visitor<'de>,
918 {
919 let mut erased = erase::Visitor::new(visitor);
920 unsafe { self.erased_deserialize_u16(&mut erased).unsafe_map(Out::take) }
921 }
922
923 fn deserialize_u32<V>($($mut)* self, visitor: V) -> Result<V::Value, Error>
924 where
925 V: serde::de::Visitor<'de>,
926 {
927 let mut erased = erase::Visitor::new(visitor);
928 unsafe { self.erased_deserialize_u32(&mut erased).unsafe_map(Out::take) }
929 }
930
931 fn deserialize_u64<V>($($mut)* self, visitor: V) -> Result<V::Value, Error>
932 where
933 V: serde::de::Visitor<'de>,
934 {
935 let mut erased = erase::Visitor::new(visitor);
936 unsafe { self.erased_deserialize_u64(&mut erased).unsafe_map(Out::take) }
937 }
938
939 fn deserialize_u128<V>($($mut)* self, visitor: V) -> Result<V::Value, Error>
940 where
941 V: serde::de::Visitor<'de>,
942 {
943 let mut erased = erase::Visitor::new(visitor);
944 unsafe { self.erased_deserialize_u128(&mut erased).unsafe_map(Out::take) }
945 }
946
947 fn deserialize_f32<V>($($mut)* self, visitor: V) -> Result<V::Value, Error>
948 where
949 V: serde::de::Visitor<'de>,
950 {
951 let mut erased = erase::Visitor::new(visitor);
952 unsafe { self.erased_deserialize_f32(&mut erased).unsafe_map(Out::take) }
953 }
954
955 fn deserialize_f64<V>($($mut)* self, visitor: V) -> Result<V::Value, Error>
956 where
957 V: serde::de::Visitor<'de>,
958 {
959 let mut erased = erase::Visitor::new(visitor);
960 unsafe { self.erased_deserialize_f64(&mut erased).unsafe_map(Out::take) }
961 }
962
963 fn deserialize_char<V>($($mut)* self, visitor: V) -> Result<V::Value, Error>
964 where
965 V: serde::de::Visitor<'de>,
966 {
967 let mut erased = erase::Visitor::new(visitor);
968 unsafe { self.erased_deserialize_char(&mut erased).unsafe_map(Out::take) }
969 }
970
971 fn deserialize_str<V>($($mut)* self, visitor: V) -> Result<V::Value, Error>
972 where
973 V: serde::de::Visitor<'de>,
974 {
975 let mut erased = erase::Visitor::new(visitor);
976 unsafe { self.erased_deserialize_str(&mut erased).unsafe_map(Out::take) }
977 }
978
979 fn deserialize_string<V>($($mut)* self, visitor: V) -> Result<V::Value, Error>
980 where
981 V: serde::de::Visitor<'de>,
982 {
983 let mut erased = erase::Visitor::new(visitor);
984 unsafe { self.erased_deserialize_string(&mut erased).unsafe_map(Out::take) }
985 }
986
987 fn deserialize_bytes<V>($($mut)* self, visitor: V) -> Result<V::Value, Error>
988 where
989 V: serde::de::Visitor<'de>,
990 {
991 let mut erased = erase::Visitor::new(visitor);
992 unsafe { self.erased_deserialize_bytes(&mut erased).unsafe_map(Out::take) }
993 }
994
995 fn deserialize_byte_buf<V>($($mut)* self, visitor: V) -> Result<V::Value, Error>
996 where
997 V: serde::de::Visitor<'de>,
998 {
999 let mut erased = erase::Visitor::new(visitor);
1000 unsafe { self.erased_deserialize_byte_buf(&mut erased).unsafe_map(Out::take) }
1001 }
1002
1003 fn deserialize_option<V>($($mut)* self, visitor: V) -> Result<V::Value, Error>
1004 where
1005 V: serde::de::Visitor<'de>,
1006 {
1007 let mut erased = erase::Visitor::new(visitor);
1008 unsafe { self.erased_deserialize_option(&mut erased).unsafe_map(Out::take) }
1009 }
1010
1011 fn deserialize_unit<V>($($mut)* self, visitor: V) -> Result<V::Value, Error>
1012 where
1013 V: serde::de::Visitor<'de>,
1014 {
1015 let mut erased = erase::Visitor::new(visitor);
1016 unsafe { self.erased_deserialize_unit(&mut erased).unsafe_map(Out::take) }
1017 }
1018
1019 fn deserialize_unit_struct<V>($($mut)* self, name: &'static str, visitor: V) -> Result<V::Value, Error>
1020 where
1021 V: serde::de::Visitor<'de>,
1022 {
1023 let mut erased = erase::Visitor::new(visitor);
1024 unsafe { self.erased_deserialize_unit_struct(name, &mut erased).unsafe_map(Out::take) }
1025 }
1026
1027 fn deserialize_newtype_struct<V>($($mut)* self, name: &'static str, visitor: V) -> Result<V::Value, Error>
1028 where
1029 V: serde::de::Visitor<'de>,
1030 {
1031 let mut erased = erase::Visitor::new(visitor);
1032 unsafe { self.erased_deserialize_newtype_struct(name, &mut erased).unsafe_map(Out::take) }
1033 }
1034
1035 fn deserialize_seq<V>($($mut)* self, visitor: V) -> Result<V::Value, Error>
1036 where
1037 V: serde::de::Visitor<'de>,
1038 {
1039 let mut erased = erase::Visitor::new(visitor);
1040 unsafe { self.erased_deserialize_seq(&mut erased).unsafe_map(Out::take) }
1041 }
1042
1043 fn deserialize_tuple<V>($($mut)* self, len: usize, visitor: V) -> Result<V::Value, Error>
1044 where
1045 V: serde::de::Visitor<'de>,
1046 {
1047 let mut erased = erase::Visitor::new(visitor);
1048 unsafe { self.erased_deserialize_tuple(len, &mut erased).unsafe_map(Out::take) }
1049 }
1050
1051 fn deserialize_tuple_struct<V>($($mut)* self, name: &'static str, len: usize, visitor: V) -> Result<V::Value, Error>
1052 where
1053 V: serde::de::Visitor<'de>,
1054 {
1055 let mut erased = erase::Visitor::new(visitor);
1056 unsafe { self.erased_deserialize_tuple_struct(name, len, &mut erased).unsafe_map(Out::take) }
1057 }
1058
1059 fn deserialize_map<V>($($mut)* self, visitor: V) -> Result<V::Value, Error>
1060 where
1061 V: serde::de::Visitor<'de>,
1062 {
1063 let mut erased = erase::Visitor::new(visitor);
1064 unsafe { self.erased_deserialize_map(&mut erased).unsafe_map(Out::take) }
1065 }
1066
1067 fn deserialize_struct<V>($($mut)* self, name: &'static str, fields: &'static [&'static str], visitor: V) -> Result<V::Value, Error>
1068 where
1069 V: serde::de::Visitor<'de>,
1070 {
1071 let mut erased = erase::Visitor::new(visitor);
1072 unsafe { self.erased_deserialize_struct(name, fields, &mut erased).unsafe_map(Out::take) }
1073 }
1074
1075 fn deserialize_identifier<V>($($mut)* self, visitor: V) -> Result<V::Value, Error>
1076 where
1077 V: serde::de::Visitor<'de>,
1078 {
1079 let mut erased = erase::Visitor::new(visitor);
1080 unsafe { self.erased_deserialize_identifier(&mut erased).unsafe_map(Out::take) }
1081 }
1082
1083 fn deserialize_enum<V>($($mut)* self, name: &'static str, variants: &'static [&'static str], visitor: V) -> Result<V::Value, Error>
1084 where
1085 V: serde::de::Visitor<'de>,
1086 {
1087 let mut erased = erase::Visitor::new(visitor);
1088 unsafe { self.erased_deserialize_enum(name, variants, &mut erased).unsafe_map(Out::take) }
1089 }
1090
1091 fn deserialize_ignored_any<V>($($mut)* self, visitor: V) -> Result<V::Value, Error>
1092 where
1093 V: serde::de::Visitor<'de>,
1094 {
1095 let mut erased = erase::Visitor::new(visitor);
1096 unsafe { self.erased_deserialize_ignored_any(&mut erased).unsafe_map(Out::take) }
1097 }
1098
1099 fn is_human_readable(&self) -> bool {
1100 self.erased_is_human_readable()
1101 }
1102 }
1103 };
1104}
1105
1106impl_deserializer_for_trait_object!({} &mut (dyn Deserializer<'de> + '_));
1107impl_deserializer_for_trait_object!({} &mut (dyn Deserializer<'de> + Send + '_));
1108impl_deserializer_for_trait_object!({} &mut (dyn Deserializer<'de> + Sync + '_));
1109impl_deserializer_for_trait_object!({} &mut (dyn Deserializer<'de> + Send + Sync + '_));
1110impl_deserializer_for_trait_object!({mut} Box<dyn Deserializer<'de> + '_>);
1111impl_deserializer_for_trait_object!({mut} Box<dyn Deserializer<'de> + Send + '_>);
1112impl_deserializer_for_trait_object!({mut} Box<dyn Deserializer<'de> + Sync + '_>);
1113impl_deserializer_for_trait_object!({mut} Box<dyn Deserializer<'de> + Send + Sync + '_>);
1114
1115impl<'de> serde::de::Visitor<'de> for &mut (dyn Visitor<'de> + '_) {
1116 type Value = Out;
1117
1118 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1119 (**self).erased_expecting(formatter)
1120 }
1121
1122 fn visit_bool<E>(self, v: bool) -> Result<Out, E>
1123 where
1124 E: serde::de::Error,
1125 {
1126 self.erased_visit_bool(v).map_err(unerase)
1127 }
1128
1129 fn visit_i8<E>(self, v: i8) -> Result<Out, E>
1130 where
1131 E: serde::de::Error,
1132 {
1133 self.erased_visit_i8(v).map_err(unerase)
1134 }
1135
1136 fn visit_i16<E>(self, v: i16) -> Result<Out, E>
1137 where
1138 E: serde::de::Error,
1139 {
1140 self.erased_visit_i16(v).map_err(unerase)
1141 }
1142
1143 fn visit_i32<E>(self, v: i32) -> Result<Out, E>
1144 where
1145 E: serde::de::Error,
1146 {
1147 self.erased_visit_i32(v).map_err(unerase)
1148 }
1149
1150 fn visit_i64<E>(self, v: i64) -> Result<Out, E>
1151 where
1152 E: serde::de::Error,
1153 {
1154 self.erased_visit_i64(v).map_err(unerase)
1155 }
1156
1157 fn visit_i128<E>(self, v: i128) -> Result<Out, E>
1158 where
1159 E: serde::de::Error,
1160 {
1161 self.erased_visit_i128(v).map_err(unerase)
1162 }
1163
1164 fn visit_u8<E>(self, v: u8) -> Result<Out, E>
1165 where
1166 E: serde::de::Error,
1167 {
1168 self.erased_visit_u8(v).map_err(unerase)
1169 }
1170
1171 fn visit_u16<E>(self, v: u16) -> Result<Out, E>
1172 where
1173 E: serde::de::Error,
1174 {
1175 self.erased_visit_u16(v).map_err(unerase)
1176 }
1177
1178 fn visit_u32<E>(self, v: u32) -> Result<Out, E>
1179 where
1180 E: serde::de::Error,
1181 {
1182 self.erased_visit_u32(v).map_err(unerase)
1183 }
1184
1185 fn visit_u64<E>(self, v: u64) -> Result<Out, E>
1186 where
1187 E: serde::de::Error,
1188 {
1189 self.erased_visit_u64(v).map_err(unerase)
1190 }
1191
1192 fn visit_u128<E>(self, v: u128) -> Result<Out, E>
1193 where
1194 E: serde::de::Error,
1195 {
1196 self.erased_visit_u128(v).map_err(unerase)
1197 }
1198
1199 fn visit_f32<E>(self, v: f32) -> Result<Out, E>
1200 where
1201 E: serde::de::Error,
1202 {
1203 self.erased_visit_f32(v).map_err(unerase)
1204 }
1205
1206 fn visit_f64<E>(self, v: f64) -> Result<Out, E>
1207 where
1208 E: serde::de::Error,
1209 {
1210 self.erased_visit_f64(v).map_err(unerase)
1211 }
1212
1213 fn visit_char<E>(self, v: char) -> Result<Out, E>
1214 where
1215 E: serde::de::Error,
1216 {
1217 self.erased_visit_char(v).map_err(unerase)
1218 }
1219
1220 fn visit_str<E>(self, v: &str) -> Result<Out, E>
1221 where
1222 E: serde::de::Error,
1223 {
1224 self.erased_visit_str(v).map_err(unerase)
1225 }
1226
1227 fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Out, E>
1228 where
1229 E: serde::de::Error,
1230 {
1231 self.erased_visit_borrowed_str(v).map_err(unerase)
1232 }
1233
1234 #[cfg(feature = "alloc")]
1235 fn visit_string<E>(self, v: String) -> Result<Out, E>
1236 where
1237 E: serde::de::Error,
1238 {
1239 self.erased_visit_string(v).map_err(unerase)
1240 }
1241
1242 fn visit_bytes<E>(self, v: &[u8]) -> Result<Out, E>
1243 where
1244 E: serde::de::Error,
1245 {
1246 self.erased_visit_bytes(v).map_err(unerase)
1247 }
1248
1249 fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Out, E>
1250 where
1251 E: serde::de::Error,
1252 {
1253 self.erased_visit_borrowed_bytes(v).map_err(unerase)
1254 }
1255
1256 #[cfg(feature = "alloc")]
1257 fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Out, E>
1258 where
1259 E: serde::de::Error,
1260 {
1261 self.erased_visit_byte_buf(v).map_err(unerase)
1262 }
1263
1264 fn visit_none<E>(self) -> Result<Out, E>
1265 where
1266 E: serde::de::Error,
1267 {
1268 self.erased_visit_none().map_err(unerase)
1269 }
1270
1271 fn visit_some<D>(self, deserializer: D) -> Result<Out, D::Error>
1272 where
1273 D: serde::Deserializer<'de>,
1274 {
1275 let mut erased = erase::Deserializer::new(deserializer);
1276 self.erased_visit_some(&mut erased).map_err(unerase)
1277 }
1278
1279 fn visit_unit<E>(self) -> Result<Out, E>
1280 where
1281 E: serde::de::Error,
1282 {
1283 self.erased_visit_unit().map_err(unerase)
1284 }
1285
1286 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Out, D::Error>
1287 where
1288 D: serde::Deserializer<'de>,
1289 {
1290 let mut erased = erase::Deserializer::new(deserializer);
1291 self.erased_visit_newtype_struct(&mut erased)
1292 .map_err(unerase)
1293 }
1294
1295 fn visit_seq<V>(self, seq: V) -> Result<Out, V::Error>
1296 where
1297 V: serde::de::SeqAccess<'de>,
1298 {
1299 let mut erased = erase::SeqAccess::new(seq);
1300 self.erased_visit_seq(&mut erased).map_err(unerase)
1301 }
1302
1303 fn visit_map<V>(self, map: V) -> Result<Out, V::Error>
1304 where
1305 V: serde::de::MapAccess<'de>,
1306 {
1307 let mut erased = erase::MapAccess::new(map);
1308 self.erased_visit_map(&mut erased).map_err(unerase)
1309 }
1310
1311 fn visit_enum<V>(self, data: V) -> Result<Out, V::Error>
1312 where
1313 V: serde::de::EnumAccess<'de>,
1314 {
1315 let mut erased = erase::EnumAccess::new(data);
1316 self.erased_visit_enum(&mut erased).map_err(unerase)
1317 }
1318}
1319
1320impl<'de> serde::de::SeqAccess<'de> for &mut (dyn SeqAccess<'de> + '_) {
1321 type Error = Error;
1322
1323 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error>
1324 where
1325 T: serde::de::DeserializeSeed<'de>,
1326 {
1327 let mut seed = erase::DeserializeSeed::new(seed);
1328 unsafe {
1329 (**self)
1330 .erased_next_element(&mut seed)
1331 .map(|opt| opt.unsafe_map(Out::take))
1332 }
1333 }
1334
1335 fn size_hint(&self) -> Option<usize> {
1336 (**self).erased_size_hint()
1337 }
1338}
1339
1340impl<'de> serde::de::MapAccess<'de> for &mut (dyn MapAccess<'de> + '_) {
1341 type Error = Error;
1342
1343 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error>
1344 where
1345 K: serde::de::DeserializeSeed<'de>,
1346 {
1347 let mut erased = erase::DeserializeSeed::new(seed);
1348 unsafe {
1349 (**self)
1350 .erased_next_key(&mut erased)
1351 .map(|opt| opt.unsafe_map(Out::take))
1352 }
1353 }
1354
1355 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error>
1356 where
1357 V: serde::de::DeserializeSeed<'de>,
1358 {
1359 let mut erased = erase::DeserializeSeed::new(seed);
1360 unsafe {
1361 (**self)
1362 .erased_next_value(&mut erased)
1363 .unsafe_map(Out::take)
1364 }
1365 }
1366
1367 fn size_hint(&self) -> Option<usize> {
1368 (**self).erased_size_hint()
1369 }
1370}
1371
1372impl<'de> serde::de::EnumAccess<'de> for &mut (dyn EnumAccess<'de> + '_) {
1373 type Error = Error;
1374 type Variant = Variant<'de>;
1375
1376 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
1377 where
1378 V: serde::de::DeserializeSeed<'de>,
1379 {
1380 let mut erased = erase::DeserializeSeed::new(seed);
1381 match self.erased_variant_seed(&mut erased) {
1382 Ok((out, variant)) => Ok((unsafe { out.take() }, variant)),
1383 Err(err) => Err(err),
1384 }
1385 }
1386}
1387
1388pub struct Variant<'de> {
1389 data: Any,
1390 unit_variant: unsafe fn(Any) -> Result<(), Error>,
1391 visit_newtype: unsafe fn(Any, seed: &mut dyn DeserializeSeed<'de>) -> Result<Out, Error>,
1392 tuple_variant: unsafe fn(Any, len: usize, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error>,
1393 struct_variant: unsafe fn(
1394 Any,
1395 fields: &'static [&'static str],
1396 visitor: &mut dyn Visitor<'de>,
1397 ) -> Result<Out, Error>,
1398}
1399
1400impl<'de> serde::de::VariantAccess<'de> for Variant<'de> {
1401 type Error = Error;
1402
1403 fn unit_variant(self) -> Result<(), Error> {
1404 unsafe { (self.unit_variant)(self.data) }
1405 }
1406
1407 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Error>
1408 where
1409 T: serde::de::DeserializeSeed<'de>,
1410 {
1411 let mut erased = erase::DeserializeSeed::new(seed);
1412 unsafe { (self.visit_newtype)(self.data, &mut erased).unsafe_map(Out::take) }
1413 }
1414
1415 fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value, Error>
1416 where
1417 V: serde::de::Visitor<'de>,
1418 {
1419 let mut erased = erase::Visitor::new(visitor);
1420 unsafe { (self.tuple_variant)(self.data, len, &mut erased).unsafe_map(Out::take) }
1421 }
1422
1423 fn struct_variant<V>(
1424 self,
1425 fields: &'static [&'static str],
1426 visitor: V,
1427 ) -> Result<V::Value, Error>
1428 where
1429 V: serde::de::Visitor<'de>,
1430 {
1431 let mut erased = erase::Visitor::new(visitor);
1432 unsafe { (self.struct_variant)(self.data, fields, &mut erased).unsafe_map(Out::take) }
1433 }
1434}
1435
1436macro_rules! deref_erased_deserializer {
1439 (<'de $(, $T:ident)*> Deserializer<'de> for $ty:ty $(where $($where:tt)*)?) => {
1440 impl<'de $(, $T)*> Deserializer<'de> for $ty $(where $($where)*)? {
1441 fn erased_deserialize_any(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1442 (**self).erased_deserialize_any(visitor)
1443 }
1444
1445 fn erased_deserialize_bool(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1446 (**self).erased_deserialize_bool(visitor)
1447 }
1448
1449 fn erased_deserialize_i8(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1450 (**self).erased_deserialize_i8(visitor)
1451 }
1452
1453 fn erased_deserialize_i16(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1454 (**self).erased_deserialize_i16(visitor)
1455 }
1456
1457 fn erased_deserialize_i32(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1458 (**self).erased_deserialize_i32(visitor)
1459 }
1460
1461 fn erased_deserialize_i64(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1462 (**self).erased_deserialize_i64(visitor)
1463 }
1464
1465 fn erased_deserialize_i128(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1466 (**self).erased_deserialize_i128(visitor)
1467 }
1468
1469 fn erased_deserialize_u8(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1470 (**self).erased_deserialize_u8(visitor)
1471 }
1472
1473 fn erased_deserialize_u16(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1474 (**self).erased_deserialize_u16(visitor)
1475 }
1476
1477 fn erased_deserialize_u32(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1478 (**self).erased_deserialize_u32(visitor)
1479 }
1480
1481 fn erased_deserialize_u64(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1482 (**self).erased_deserialize_u64(visitor)
1483 }
1484
1485 fn erased_deserialize_u128(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1486 (**self).erased_deserialize_u128(visitor)
1487 }
1488
1489 fn erased_deserialize_f32(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1490 (**self).erased_deserialize_f32(visitor)
1491 }
1492
1493 fn erased_deserialize_f64(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1494 (**self).erased_deserialize_f64(visitor)
1495 }
1496
1497 fn erased_deserialize_char(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1498 (**self).erased_deserialize_char(visitor)
1499 }
1500
1501 fn erased_deserialize_str(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1502 (**self).erased_deserialize_str(visitor)
1503 }
1504
1505 fn erased_deserialize_string(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1506 (**self).erased_deserialize_string(visitor)
1507 }
1508
1509 fn erased_deserialize_bytes(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1510 (**self).erased_deserialize_bytes(visitor)
1511 }
1512
1513 fn erased_deserialize_byte_buf(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1514 (**self).erased_deserialize_byte_buf(visitor)
1515 }
1516
1517 fn erased_deserialize_option(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1518 (**self).erased_deserialize_option(visitor)
1519 }
1520
1521 fn erased_deserialize_unit(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1522 (**self).erased_deserialize_unit(visitor)
1523 }
1524
1525 fn erased_deserialize_unit_struct(&mut self, name: &'static str, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1526 (**self).erased_deserialize_unit_struct(name, visitor)
1527 }
1528
1529 fn erased_deserialize_newtype_struct(&mut self, name: &'static str, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1530 (**self).erased_deserialize_newtype_struct(name, visitor)
1531 }
1532
1533 fn erased_deserialize_seq(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1534 (**self).erased_deserialize_seq(visitor)
1535 }
1536
1537 fn erased_deserialize_tuple(&mut self, len: usize, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1538 (**self).erased_deserialize_tuple(len, visitor)
1539 }
1540
1541 fn erased_deserialize_tuple_struct(&mut self, name: &'static str, len: usize, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1542 (**self).erased_deserialize_tuple_struct(name, len, visitor)
1543 }
1544
1545 fn erased_deserialize_map(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1546 (**self).erased_deserialize_map(visitor)
1547 }
1548
1549 fn erased_deserialize_struct(&mut self, name: &'static str, fields: &'static [&'static str], visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1550 (**self).erased_deserialize_struct(name, fields, visitor)
1551 }
1552
1553 fn erased_deserialize_identifier(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1554 (**self).erased_deserialize_identifier(visitor)
1555 }
1556
1557 fn erased_deserialize_enum(&mut self, name: &'static str, variants: &'static [&'static str], visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1558 (**self).erased_deserialize_enum(name, variants, visitor)
1559 }
1560
1561 fn erased_deserialize_ignored_any(&mut self, visitor: &mut dyn Visitor<'de>) -> Result<Out, Error> {
1562 (**self).erased_deserialize_ignored_any(visitor)
1563 }
1564
1565 fn erased_is_human_readable(&self) -> bool {
1566 (**self).erased_is_human_readable()
1567 }
1568 }
1569
1570 impl<'de $(, $T)*> Sealed for $ty $(where $($where)*)? {}
1571 };
1572}
1573
1574deref_erased_deserializer!(<'de, T> Deserializer<'de> for &mut T where T: ?Sized + Deserializer<'de>);
1575deref_erased_deserializer!(<'de, T> Deserializer<'de> for Box<T> where T: ?Sized + Deserializer<'de>);
1576
1577#[cfg(test)]
1580mod tests {
1581 use super::*;
1582 use alloc::borrow::ToOwned;
1583 use core::fmt::Debug;
1584 use serde_derive::Deserialize;
1585
1586 fn test_json<'de, T>(json: &'de [u8])
1587 where
1588 T: serde::Deserialize<'de> + PartialEq + Debug,
1589 {
1590 let expected: T = serde_json::from_slice(json).unwrap();
1591
1592 {
1594 let mut de = serde_json::Deserializer::from_slice(json);
1595 let de: &mut dyn Deserializer = &mut <dyn Deserializer>::erase(&mut de);
1596 assert_eq!(expected, deserialize::<T>(de).unwrap());
1597 }
1598
1599 {
1601 let mut de = serde_json::Deserializer::from_slice(json);
1602 let mut de: Box<dyn Deserializer> = Box::new(<dyn Deserializer>::erase(&mut de));
1603 assert_eq!(expected, deserialize::<T>(&mut de).unwrap());
1604 }
1605 }
1606
1607 #[test]
1608 fn test_value() {
1609 test_json::<serde_json::Value>(br#"["a", 1, [true], {"a": 1}]"#);
1610 }
1611
1612 #[test]
1613 fn test_struct() {
1614 #[derive(Deserialize, PartialEq, Debug)]
1615 struct S {
1616 f: usize,
1617 }
1618
1619 test_json::<S>(br#"{"f":256}"#);
1620 }
1621
1622 #[test]
1623 fn test_enum() {
1624 #[derive(Deserialize, PartialEq, Debug)]
1625 enum E {
1626 Unit,
1627 Newtype(bool),
1628 Tuple(bool, bool),
1629 Struct { t: bool, f: bool },
1630 }
1631
1632 test_json::<E>(br#""Unit""#);
1633 test_json::<E>(br#"{"Newtype":true}"#);
1634 test_json::<E>(br#"{"Tuple":[true,false]}"#);
1635 test_json::<E>(br#"{"Struct":{"t":true,"f":false}}"#);
1636 }
1637
1638 #[test]
1639 fn test_borrowed() {
1640 let bytes = br#""borrowed""#.to_owned();
1641 test_json::<&str>(&bytes);
1642 }
1643
1644 #[test]
1645 fn assert_deserializer() {
1646 fn assert<'de, T: serde::Deserializer<'de>>() {}
1647
1648 assert::<&mut dyn Deserializer>();
1649 assert::<&mut (dyn Deserializer + Send)>();
1650 assert::<&mut (dyn Deserializer + Sync)>();
1651 assert::<&mut (dyn Deserializer + Send + Sync)>();
1652 assert::<&mut (dyn Deserializer + Sync + Send)>();
1653
1654 assert::<Box<dyn Deserializer>>();
1655 assert::<Box<dyn Deserializer + Send>>();
1656 assert::<Box<dyn Deserializer + Sync>>();
1657 assert::<Box<dyn Deserializer + Send + Sync>>();
1658 assert::<Box<dyn Deserializer + Sync + Send>>();
1659 }
1660}