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