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