1use crate::alloc::Box;
2use crate::any::Any;
3use crate::error::Error;
4use crate::map::ResultExt;
5use core::fmt::Display;
6use core::marker::PhantomData;
7use serde::ser::{
8 SerializeMap, SerializeSeq, SerializeStruct, SerializeStructVariant, SerializeTuple,
9 SerializeTupleStruct, SerializeTupleVariant,
10};
11
12pub trait Serialize {
53 fn erased_serialize(&self, v: &mut dyn Serializer) -> Result<Ok, Error>;
54}
55
56pub trait Serializer {
96 fn erased_serialize_bool(&mut self, v: bool) -> Result<Ok, Error>;
97 fn erased_serialize_i8(&mut self, v: i8) -> Result<Ok, Error>;
98 fn erased_serialize_i16(&mut self, v: i16) -> Result<Ok, Error>;
99 fn erased_serialize_i32(&mut self, v: i32) -> Result<Ok, Error>;
100 fn erased_serialize_i64(&mut self, v: i64) -> Result<Ok, Error>;
101 fn erased_serialize_i128(&mut self, v: i128) -> Result<Ok, Error>;
102 fn erased_serialize_u8(&mut self, v: u8) -> Result<Ok, Error>;
103 fn erased_serialize_u16(&mut self, v: u16) -> Result<Ok, Error>;
104 fn erased_serialize_u32(&mut self, v: u32) -> Result<Ok, Error>;
105 fn erased_serialize_u64(&mut self, v: u64) -> Result<Ok, Error>;
106 fn erased_serialize_u128(&mut self, v: u128) -> Result<Ok, Error>;
107 fn erased_serialize_f32(&mut self, v: f32) -> Result<Ok, Error>;
108 fn erased_serialize_f64(&mut self, v: f64) -> Result<Ok, Error>;
109 fn erased_serialize_char(&mut self, v: char) -> Result<Ok, Error>;
110 fn erased_serialize_str(&mut self, v: &str) -> Result<Ok, Error>;
111 fn erased_serialize_bytes(&mut self, v: &[u8]) -> Result<Ok, Error>;
112 fn erased_serialize_none(&mut self) -> Result<Ok, Error>;
113 fn erased_serialize_some(&mut self, v: &dyn Serialize) -> Result<Ok, Error>;
114 fn erased_serialize_unit(&mut self) -> Result<Ok, Error>;
115 fn erased_serialize_unit_struct(&mut self, name: &'static str) -> Result<Ok, Error>;
116 fn erased_serialize_unit_variant(
117 &mut self,
118 name: &'static str,
119 variant_index: u32,
120 variant: &'static str,
121 ) -> Result<Ok, Error>;
122 fn erased_serialize_newtype_struct(
123 &mut self,
124 name: &'static str,
125 v: &dyn Serialize,
126 ) -> Result<Ok, Error>;
127 fn erased_serialize_newtype_variant(
128 &mut self,
129 name: &'static str,
130 variant_index: u32,
131 variant: &'static str,
132 v: &dyn Serialize,
133 ) -> Result<Ok, Error>;
134 fn erased_serialize_seq(&mut self, len: Option<usize>) -> Result<Seq, Error>;
135 fn erased_serialize_tuple(&mut self, len: usize) -> Result<Tuple, Error>;
136 fn erased_serialize_tuple_struct(
137 &mut self,
138 name: &'static str,
139 len: usize,
140 ) -> Result<TupleStruct, Error>;
141 fn erased_serialize_tuple_variant(
142 &mut self,
143 name: &'static str,
144 variant_index: u32,
145 variant: &'static str,
146 len: usize,
147 ) -> Result<TupleVariant, Error>;
148 fn erased_serialize_map(&mut self, len: Option<usize>) -> Result<Map, Error>;
149 fn erased_serialize_struct(&mut self, name: &'static str, len: usize) -> Result<Struct, Error>;
150 fn erased_serialize_struct_variant(
151 &mut self,
152 name: &'static str,
153 variant_index: u32,
154 variant: &'static str,
155 len: usize,
156 ) -> Result<StructVariant, Error>;
157 fn erased_is_human_readable(&self) -> bool;
158}
159
160impl dyn Serializer {
161 pub fn erase<S>(serializer: S) -> erase::Serializer<S>
197 where
198 S: serde::Serializer,
199 S::Ok: 'static,
200 {
201 erase::Serializer {
202 state: Some(serializer),
203 }
204 }
205}
206
207pub struct Ok {
218 data: Any,
219}
220
221impl Ok {
222 unsafe fn new<T>(t: T) -> Self {
223 Ok {
224 data: unsafe { Any::new(t) },
225 }
226 }
227
228 unsafe fn take<T>(self) -> T {
229 unsafe { self.data.take() }
230 }
231}
232
233impl<T> Serialize for T
236where
237 T: ?Sized + serde::Serialize,
238{
239 fn erased_serialize(&self, serializer: &mut dyn Serializer) -> Result<Ok, Error> {
240 self.serialize(serializer)
241 }
242}
243
244mod erase {
245 pub struct Serializer<S> {
246 pub(crate) state: Option<S>,
247 }
248
249 impl<S> Serializer<S> {
250 pub(crate) fn take(&mut self) -> S {
251 self.state.take().unwrap()
252 }
253
254 pub(crate) fn as_ref(&self) -> &S {
255 self.state.as_ref().unwrap()
256 }
257 }
258}
259
260impl<T> Serializer for erase::Serializer<T>
261where
262 T: serde::Serializer,
263{
264 fn erased_serialize_bool(&mut self, v: bool) -> Result<Ok, Error> {
265 unsafe {
266 self.take()
267 .serialize_bool(v)
268 .unsafe_map(Ok::new)
269 .map_err(erase)
270 }
271 }
272
273 fn erased_serialize_i8(&mut self, v: i8) -> Result<Ok, Error> {
274 unsafe {
275 self.take()
276 .serialize_i8(v)
277 .unsafe_map(Ok::new)
278 .map_err(erase)
279 }
280 }
281
282 fn erased_serialize_i16(&mut self, v: i16) -> Result<Ok, Error> {
283 unsafe {
284 self.take()
285 .serialize_i16(v)
286 .unsafe_map(Ok::new)
287 .map_err(erase)
288 }
289 }
290
291 fn erased_serialize_i32(&mut self, v: i32) -> Result<Ok, Error> {
292 unsafe {
293 self.take()
294 .serialize_i32(v)
295 .unsafe_map(Ok::new)
296 .map_err(erase)
297 }
298 }
299
300 fn erased_serialize_i64(&mut self, v: i64) -> Result<Ok, Error> {
301 unsafe {
302 self.take()
303 .serialize_i64(v)
304 .unsafe_map(Ok::new)
305 .map_err(erase)
306 }
307 }
308
309 fn erased_serialize_i128(&mut self, v: i128) -> Result<Ok, Error> {
310 unsafe {
311 self.take()
312 .serialize_i128(v)
313 .unsafe_map(Ok::new)
314 .map_err(erase)
315 }
316 }
317
318 fn erased_serialize_u8(&mut self, v: u8) -> Result<Ok, Error> {
319 unsafe {
320 self.take()
321 .serialize_u8(v)
322 .unsafe_map(Ok::new)
323 .map_err(erase)
324 }
325 }
326
327 fn erased_serialize_u16(&mut self, v: u16) -> Result<Ok, Error> {
328 unsafe {
329 self.take()
330 .serialize_u16(v)
331 .unsafe_map(Ok::new)
332 .map_err(erase)
333 }
334 }
335
336 fn erased_serialize_u32(&mut self, v: u32) -> Result<Ok, Error> {
337 unsafe {
338 self.take()
339 .serialize_u32(v)
340 .unsafe_map(Ok::new)
341 .map_err(erase)
342 }
343 }
344
345 fn erased_serialize_u64(&mut self, v: u64) -> Result<Ok, Error> {
346 unsafe {
347 self.take()
348 .serialize_u64(v)
349 .unsafe_map(Ok::new)
350 .map_err(erase)
351 }
352 }
353
354 fn erased_serialize_u128(&mut self, v: u128) -> Result<Ok, Error> {
355 unsafe {
356 self.take()
357 .serialize_u128(v)
358 .unsafe_map(Ok::new)
359 .map_err(erase)
360 }
361 }
362
363 fn erased_serialize_f32(&mut self, v: f32) -> Result<Ok, Error> {
364 unsafe {
365 self.take()
366 .serialize_f32(v)
367 .unsafe_map(Ok::new)
368 .map_err(erase)
369 }
370 }
371
372 fn erased_serialize_f64(&mut self, v: f64) -> Result<Ok, Error> {
373 unsafe {
374 self.take()
375 .serialize_f64(v)
376 .unsafe_map(Ok::new)
377 .map_err(erase)
378 }
379 }
380
381 fn erased_serialize_char(&mut self, v: char) -> Result<Ok, Error> {
382 unsafe {
383 self.take()
384 .serialize_char(v)
385 .unsafe_map(Ok::new)
386 .map_err(erase)
387 }
388 }
389
390 fn erased_serialize_str(&mut self, v: &str) -> Result<Ok, Error> {
391 unsafe {
392 self.take()
393 .serialize_str(v)
394 .unsafe_map(Ok::new)
395 .map_err(erase)
396 }
397 }
398
399 fn erased_serialize_bytes(&mut self, v: &[u8]) -> Result<Ok, Error> {
400 unsafe {
401 self.take()
402 .serialize_bytes(v)
403 .unsafe_map(Ok::new)
404 .map_err(erase)
405 }
406 }
407
408 fn erased_serialize_none(&mut self) -> Result<Ok, Error> {
409 unsafe {
410 self.take()
411 .serialize_none()
412 .unsafe_map(Ok::new)
413 .map_err(erase)
414 }
415 }
416
417 fn erased_serialize_some(&mut self, v: &dyn Serialize) -> Result<Ok, Error> {
418 unsafe {
419 self.take()
420 .serialize_some(v)
421 .unsafe_map(Ok::new)
422 .map_err(erase)
423 }
424 }
425
426 fn erased_serialize_unit(&mut self) -> Result<Ok, Error> {
427 unsafe {
428 self.take()
429 .serialize_unit()
430 .unsafe_map(Ok::new)
431 .map_err(erase)
432 }
433 }
434
435 fn erased_serialize_unit_struct(&mut self, name: &'static str) -> Result<Ok, Error> {
436 unsafe {
437 self.take()
438 .serialize_unit_struct(name)
439 .unsafe_map(Ok::new)
440 .map_err(erase)
441 }
442 }
443
444 fn erased_serialize_unit_variant(
445 &mut self,
446 name: &'static str,
447 variant_index: u32,
448 variant: &'static str,
449 ) -> Result<Ok, Error> {
450 unsafe {
451 self.take()
452 .serialize_unit_variant(name, variant_index, variant)
453 .unsafe_map(Ok::new)
454 .map_err(erase)
455 }
456 }
457
458 fn erased_serialize_newtype_struct(
459 &mut self,
460 name: &'static str,
461 v: &dyn Serialize,
462 ) -> Result<Ok, Error> {
463 unsafe {
464 self.take()
465 .serialize_newtype_struct(name, v)
466 .unsafe_map(Ok::new)
467 .map_err(erase)
468 }
469 }
470
471 fn erased_serialize_newtype_variant(
472 &mut self,
473 name: &'static str,
474 variant_index: u32,
475 variant: &'static str,
476 v: &dyn Serialize,
477 ) -> Result<Ok, Error> {
478 unsafe {
479 self.take()
480 .serialize_newtype_variant(name, variant_index, variant, v)
481 .unsafe_map(Ok::new)
482 .map_err(erase)
483 }
484 }
485
486 fn erased_serialize_seq(&mut self, len: Option<usize>) -> Result<Seq, Error> {
487 unsafe {
488 self.take()
489 .serialize_seq(len)
490 .unsafe_map(Seq::new)
491 .map_err(erase)
492 }
493 }
494
495 fn erased_serialize_tuple(&mut self, len: usize) -> Result<Tuple, Error> {
496 unsafe {
497 self.take()
498 .serialize_tuple(len)
499 .unsafe_map(Tuple::new)
500 .map_err(erase)
501 }
502 }
503
504 fn erased_serialize_tuple_struct(
505 &mut self,
506 name: &'static str,
507 len: usize,
508 ) -> Result<TupleStruct, Error> {
509 unsafe {
510 self.take()
511 .serialize_tuple_struct(name, len)
512 .unsafe_map(TupleStruct::new)
513 .map_err(erase)
514 }
515 }
516
517 fn erased_serialize_tuple_variant(
518 &mut self,
519 name: &'static str,
520 variant_index: u32,
521 variant: &'static str,
522 len: usize,
523 ) -> Result<TupleVariant, Error> {
524 unsafe {
525 self.take()
526 .serialize_tuple_variant(name, variant_index, variant, len)
527 .unsafe_map(TupleVariant::new)
528 .map_err(erase)
529 }
530 }
531
532 fn erased_serialize_map(&mut self, len: Option<usize>) -> Result<Map, Error> {
533 unsafe {
534 self.take()
535 .serialize_map(len)
536 .unsafe_map(Map::new)
537 .map_err(erase)
538 }
539 }
540
541 fn erased_serialize_struct(&mut self, name: &'static str, len: usize) -> Result<Struct, Error> {
542 unsafe {
543 self.take()
544 .serialize_struct(name, len)
545 .unsafe_map(Struct::new)
546 .map_err(erase)
547 }
548 }
549
550 fn erased_serialize_struct_variant(
551 &mut self,
552 name: &'static str,
553 variant_index: u32,
554 variant: &'static str,
555 len: usize,
556 ) -> Result<StructVariant, Error> {
557 unsafe {
558 self.take()
559 .serialize_struct_variant(name, variant_index, variant, len)
560 .unsafe_map(StructVariant::new)
561 .map_err(erase)
562 }
563 }
564
565 fn erased_is_human_readable(&self) -> bool {
566 self.as_ref().is_human_readable()
567 }
568}
569
570pub fn serialize<T, S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
602where
603 T: ?Sized + Serialize,
604 S: serde::Serializer,
605{
606 let mut erased = erase::Serializer {
607 state: Some(serializer),
608 };
609 unsafe {
610 value
611 .erased_serialize(&mut erased)
612 .unsafe_map(Ok::take)
613 .map_err(unerase)
614 }
615}
616
617serialize_trait_object!(Serialize);
618
619macro_rules! impl_serializer_for_trait_object {
620 ($ty:ty) => {
621 impl<'a> serde::Serializer for $ty {
622 type Ok = Ok;
623 type Error = Error;
624 type SerializeSeq = Seq<'a>;
625 type SerializeTuple = Tuple<'a>;
626 type SerializeTupleStruct = TupleStruct<'a>;
627 type SerializeTupleVariant = TupleVariant<'a>;
628 type SerializeMap = Map<'a>;
629 type SerializeStruct = Struct<'a>;
630 type SerializeStructVariant = StructVariant<'a>;
631
632 fn serialize_bool(self, v: bool) -> Result<Ok, Error> {
633 self.erased_serialize_bool(v)
634 }
635
636 fn serialize_i8(self, v: i8) -> Result<Ok, Error> {
637 self.erased_serialize_i8(v)
638 }
639
640 fn serialize_i16(self, v: i16) -> Result<Ok, Error> {
641 self.erased_serialize_i16(v)
642 }
643
644 fn serialize_i32(self, v: i32) -> Result<Ok, Error> {
645 self.erased_serialize_i32(v)
646 }
647
648 fn serialize_i64(self, v: i64) -> Result<Ok, Error> {
649 self.erased_serialize_i64(v)
650 }
651
652 fn serialize_i128(self, v: i128) -> Result<Ok, Error> {
653 self.erased_serialize_i128(v)
654 }
655
656 fn serialize_u8(self, v: u8) -> Result<Ok, Error> {
657 self.erased_serialize_u8(v)
658 }
659
660 fn serialize_u16(self, v: u16) -> Result<Ok, Error> {
661 self.erased_serialize_u16(v)
662 }
663
664 fn serialize_u32(self, v: u32) -> Result<Ok, Error> {
665 self.erased_serialize_u32(v)
666 }
667
668 fn serialize_u64(self, v: u64) -> Result<Ok, Error> {
669 self.erased_serialize_u64(v)
670 }
671
672 fn serialize_u128(self, v: u128) -> Result<Ok, Error> {
673 self.erased_serialize_u128(v)
674 }
675
676 fn serialize_f32(self, v: f32) -> Result<Ok, Error> {
677 self.erased_serialize_f32(v)
678 }
679
680 fn serialize_f64(self, v: f64) -> Result<Ok, Error> {
681 self.erased_serialize_f64(v)
682 }
683
684 fn serialize_char(self, v: char) -> Result<Ok, Error> {
685 self.erased_serialize_char(v)
686 }
687
688 fn serialize_str(self, v: &str) -> Result<Ok, Error> {
689 self.erased_serialize_str(v)
690 }
691
692 fn serialize_bytes(self, v: &[u8]) -> Result<Ok, Error> {
693 self.erased_serialize_bytes(v)
694 }
695
696 fn serialize_none(self) -> Result<Ok, Error> {
697 self.erased_serialize_none()
698 }
699
700 fn serialize_some<T>(self, v: &T) -> Result<Ok, Error>
701 where
702 T: ?Sized + serde::Serialize,
703 {
704 self.erased_serialize_some(&v)
705 }
706
707 fn serialize_unit(self) -> Result<Ok, Error> {
708 self.erased_serialize_unit()
709 }
710
711 fn serialize_unit_struct(self, name: &'static str) -> Result<Ok, Error> {
712 self.erased_serialize_unit_struct(name)
713 }
714
715 fn serialize_unit_variant(
716 self,
717 name: &'static str,
718 variant_index: u32,
719 variant: &'static str,
720 ) -> Result<Ok, Error> {
721 self.erased_serialize_unit_variant(name, variant_index, variant)
722 }
723
724 fn serialize_newtype_struct<T>(self, name: &'static str, v: &T) -> Result<Ok, Error>
725 where
726 T: ?Sized + serde::Serialize,
727 {
728 self.erased_serialize_newtype_struct(name, &v)
729 }
730
731 fn serialize_newtype_variant<T>(
732 self,
733 name: &'static str,
734 variant_index: u32,
735 variant: &'static str,
736 v: &T,
737 ) -> Result<Ok, Error>
738 where
739 T: ?Sized + serde::Serialize,
740 {
741 self.erased_serialize_newtype_variant(name, variant_index, variant, &v)
742 }
743
744 fn serialize_seq(self, len: Option<usize>) -> Result<Seq<'a>, Error> {
745 self.erased_serialize_seq(len)
746 }
747
748 fn serialize_tuple(self, len: usize) -> Result<Tuple<'a>, Error> {
749 self.erased_serialize_tuple(len)
750 }
751
752 fn serialize_tuple_struct(
753 self,
754 name: &'static str,
755 len: usize,
756 ) -> Result<TupleStruct<'a>, Error> {
757 self.erased_serialize_tuple_struct(name, len)
758 }
759
760 fn serialize_tuple_variant(
761 self,
762 name: &'static str,
763 variant_index: u32,
764 variant: &'static str,
765 len: usize,
766 ) -> Result<TupleVariant<'a>, Error> {
767 self.erased_serialize_tuple_variant(name, variant_index, variant, len)
768 }
769
770 fn serialize_map(self, len: Option<usize>) -> Result<Map<'a>, Error> {
771 self.erased_serialize_map(len)
772 }
773
774 fn serialize_struct(self, name: &'static str, len: usize) -> Result<Struct<'a>, Error> {
775 self.erased_serialize_struct(name, len)
776 }
777
778 fn serialize_struct_variant(
779 self,
780 name: &'static str,
781 variant_index: u32,
782 variant: &'static str,
783 len: usize,
784 ) -> Result<StructVariant<'a>, Error> {
785 self.erased_serialize_struct_variant(name, variant_index, variant, len)
786 }
787
788 #[cfg(not(any(feature = "std", feature = "alloc")))]
789 fn collect_str<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
790 where
791 T: ?Sized + Display,
792 {
793 unreachable!()
794 }
795
796 fn is_human_readable(&self) -> bool {
797 self.erased_is_human_readable()
798 }
799 }
800 };
801}
802
803impl_serializer_for_trait_object!(&'a mut (dyn Serializer + '_));
804impl_serializer_for_trait_object!(&'a mut (dyn Serializer + Send + '_));
805impl_serializer_for_trait_object!(&'a mut (dyn Serializer + Sync + '_));
806impl_serializer_for_trait_object!(&'a mut (dyn Serializer + Send + Sync + '_));
807
808pub struct Seq<'a> {
809 data: Any,
810 serialize_element: unsafe fn(&mut Any, &dyn Serialize) -> Result<(), Error>,
811 end: unsafe fn(Any) -> Result<Ok, Error>,
812 lifetime: PhantomData<&'a dyn Serializer>,
813}
814
815impl<'a> Seq<'a> {
816 unsafe fn new<T>(data: T) -> Self
817 where
818 T: serde::ser::SerializeSeq,
819 {
820 Seq {
821 data: unsafe { Any::new(data) },
822 serialize_element: {
823 unsafe fn serialize_element<T>(
824 data: &mut Any,
825 v: &dyn Serialize,
826 ) -> Result<(), Error>
827 where
828 T: serde::ser::SerializeSeq,
829 {
830 unsafe { data.view::<T>().serialize_element(v).map_err(erase) }
831 }
832 serialize_element::<T>
833 },
834 end: {
835 unsafe fn end<T>(data: Any) -> Result<Ok, Error>
836 where
837 T: serde::ser::SerializeSeq,
838 {
839 unsafe { data.take::<T>().end().unsafe_map(Ok::new).map_err(erase) }
840 }
841 end::<T>
842 },
843 lifetime: PhantomData,
844 }
845 }
846}
847
848impl<'a> SerializeSeq for Seq<'a> {
849 type Ok = Ok;
850 type Error = Error;
851
852 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Error>
853 where
854 T: ?Sized + serde::Serialize,
855 {
856 unsafe { (self.serialize_element)(&mut self.data, &value) }
857 }
858
859 fn end(self) -> Result<Ok, Error> {
860 unsafe { (self.end)(self.data) }
861 }
862}
863
864pub struct Tuple<'a> {
865 data: Any,
866 serialize_element: unsafe fn(&mut Any, &dyn Serialize) -> Result<(), Error>,
867 end: unsafe fn(Any) -> Result<Ok, Error>,
868 lifetime: PhantomData<&'a dyn Serializer>,
869}
870
871impl<'a> Tuple<'a> {
872 unsafe fn new<T>(data: T) -> Self
873 where
874 T: serde::ser::SerializeTuple,
875 {
876 Tuple {
877 data: unsafe { Any::new(data) },
878 serialize_element: {
879 unsafe fn serialize_element<T>(
880 data: &mut Any,
881 v: &dyn Serialize,
882 ) -> Result<(), Error>
883 where
884 T: serde::ser::SerializeTuple,
885 {
886 unsafe { data.view::<T>().serialize_element(v).map_err(erase) }
887 }
888 serialize_element::<T>
889 },
890 end: {
891 unsafe fn end<T>(data: Any) -> Result<Ok, Error>
892 where
893 T: serde::ser::SerializeTuple,
894 {
895 unsafe { data.take::<T>().end().unsafe_map(Ok::new).map_err(erase) }
896 }
897 end::<T>
898 },
899 lifetime: PhantomData,
900 }
901 }
902}
903
904impl<'a> SerializeTuple for Tuple<'a> {
905 type Ok = Ok;
906 type Error = Error;
907
908 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Error>
909 where
910 T: ?Sized + serde::Serialize,
911 {
912 unsafe { (self.serialize_element)(&mut self.data, &value) }
913 }
914
915 fn end(self) -> Result<Ok, Error> {
916 unsafe { (self.end)(self.data) }
917 }
918}
919
920pub struct TupleStruct<'a> {
921 data: Any,
922 serialize_field: unsafe fn(&mut Any, &dyn Serialize) -> Result<(), Error>,
923 end: unsafe fn(Any) -> Result<Ok, Error>,
924 lifetime: PhantomData<&'a dyn Serializer>,
925}
926
927impl<'a> TupleStruct<'a> {
928 unsafe fn new<T>(data: T) -> Self
929 where
930 T: serde::ser::SerializeTupleStruct,
931 {
932 TupleStruct {
933 data: unsafe { Any::new(data) },
934 serialize_field: {
935 unsafe fn serialize_field<T>(data: &mut Any, v: &dyn Serialize) -> Result<(), Error>
936 where
937 T: serde::ser::SerializeTupleStruct,
938 {
939 unsafe { data.view::<T>().serialize_field(v).map_err(erase) }
940 }
941 serialize_field::<T>
942 },
943 end: {
944 unsafe fn end<T>(data: Any) -> Result<Ok, Error>
945 where
946 T: serde::ser::SerializeTupleStruct,
947 {
948 unsafe { data.take::<T>().end().unsafe_map(Ok::new).map_err(erase) }
949 }
950 end::<T>
951 },
952 lifetime: PhantomData,
953 }
954 }
955}
956
957impl<'a> SerializeTupleStruct for TupleStruct<'a> {
958 type Ok = Ok;
959 type Error = Error;
960
961 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Error>
962 where
963 T: ?Sized + serde::Serialize,
964 {
965 unsafe { (self.serialize_field)(&mut self.data, &value) }
966 }
967
968 fn end(self) -> Result<Ok, Error> {
969 unsafe { (self.end)(self.data) }
970 }
971}
972
973pub struct TupleVariant<'a> {
974 data: Any,
975 serialize_field: unsafe fn(&mut Any, &dyn Serialize) -> Result<(), Error>,
976 end: unsafe fn(Any) -> Result<Ok, Error>,
977 lifetime: PhantomData<&'a dyn Serializer>,
978}
979
980impl<'a> TupleVariant<'a> {
981 unsafe fn new<T>(data: T) -> Self
982 where
983 T: serde::ser::SerializeTupleVariant,
984 {
985 TupleVariant {
986 data: unsafe { Any::new(data) },
987 serialize_field: {
988 unsafe fn serialize_field<T>(data: &mut Any, v: &dyn Serialize) -> Result<(), Error>
989 where
990 T: serde::ser::SerializeTupleVariant,
991 {
992 unsafe { data.view::<T>().serialize_field(v).map_err(erase) }
993 }
994 serialize_field::<T>
995 },
996 end: {
997 unsafe fn end<T>(data: Any) -> Result<Ok, Error>
998 where
999 T: serde::ser::SerializeTupleVariant,
1000 {
1001 unsafe { data.take::<T>().end().unsafe_map(Ok::new).map_err(erase) }
1002 }
1003 end::<T>
1004 },
1005 lifetime: PhantomData,
1006 }
1007 }
1008}
1009
1010impl<'a> SerializeTupleVariant for TupleVariant<'a> {
1011 type Ok = Ok;
1012 type Error = Error;
1013
1014 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Error>
1015 where
1016 T: ?Sized + serde::Serialize,
1017 {
1018 unsafe { (self.serialize_field)(&mut self.data, &value) }
1019 }
1020
1021 fn end(self) -> Result<Ok, Error> {
1022 unsafe { (self.end)(self.data) }
1023 }
1024}
1025
1026pub struct Map<'a> {
1027 data: Any,
1028 serialize_key: unsafe fn(&mut Any, &dyn Serialize) -> Result<(), Error>,
1029 serialize_value: unsafe fn(&mut Any, &dyn Serialize) -> Result<(), Error>,
1030 serialize_entry: unsafe fn(&mut Any, &dyn Serialize, &dyn Serialize) -> Result<(), Error>,
1031 end: unsafe fn(Any) -> Result<Ok, Error>,
1032 lifetime: PhantomData<&'a dyn Serializer>,
1033}
1034
1035impl<'a> Map<'a> {
1036 unsafe fn new<T>(data: T) -> Self
1037 where
1038 T: serde::ser::SerializeMap,
1039 {
1040 Map {
1041 data: unsafe { Any::new(data) },
1042 serialize_key: {
1043 unsafe fn serialize_key<T>(data: &mut Any, v: &dyn Serialize) -> Result<(), Error>
1044 where
1045 T: serde::ser::SerializeMap,
1046 {
1047 unsafe { data.view::<T>().serialize_key(v).map_err(erase) }
1048 }
1049 serialize_key::<T>
1050 },
1051 serialize_value: {
1052 unsafe fn serialize_value<T>(data: &mut Any, v: &dyn Serialize) -> Result<(), Error>
1053 where
1054 T: serde::ser::SerializeMap,
1055 {
1056 unsafe { data.view::<T>().serialize_value(v).map_err(erase) }
1057 }
1058 serialize_value::<T>
1059 },
1060 serialize_entry: {
1061 unsafe fn serialize_entry<T>(
1062 data: &mut Any,
1063 k: &dyn Serialize,
1064 v: &dyn Serialize,
1065 ) -> Result<(), Error>
1066 where
1067 T: serde::ser::SerializeMap,
1068 {
1069 unsafe { data.view::<T>().serialize_entry(k, v).map_err(erase) }
1070 }
1071 serialize_entry::<T>
1072 },
1073 end: {
1074 unsafe fn end<T>(data: Any) -> Result<Ok, Error>
1075 where
1076 T: serde::ser::SerializeMap,
1077 {
1078 unsafe { data.take::<T>().end().unsafe_map(Ok::new).map_err(erase) }
1079 }
1080 end::<T>
1081 },
1082 lifetime: PhantomData,
1083 }
1084 }
1085}
1086
1087impl<'a> SerializeMap for Map<'a> {
1088 type Ok = Ok;
1089 type Error = Error;
1090
1091 fn serialize_key<T>(&mut self, key: &T) -> Result<(), Error>
1092 where
1093 T: ?Sized + serde::Serialize,
1094 {
1095 unsafe { (self.serialize_key)(&mut self.data, &key) }
1096 }
1097
1098 fn serialize_value<T>(&mut self, value: &T) -> Result<(), Error>
1099 where
1100 T: ?Sized + serde::Serialize,
1101 {
1102 unsafe { (self.serialize_value)(&mut self.data, &value) }
1103 }
1104
1105 fn serialize_entry<K, V>(&mut self, key: &K, value: &V) -> Result<(), Error>
1106 where
1107 K: ?Sized + serde::Serialize,
1108 V: ?Sized + serde::Serialize,
1109 {
1110 unsafe { (self.serialize_entry)(&mut self.data, &key, &value) }
1111 }
1112
1113 fn end(self) -> Result<Ok, Error> {
1114 unsafe { (self.end)(self.data) }
1115 }
1116}
1117
1118pub struct Struct<'a> {
1119 data: Any,
1120 serialize_field: unsafe fn(&mut Any, &'static str, &dyn Serialize) -> Result<(), Error>,
1121 end: unsafe fn(Any) -> Result<Ok, Error>,
1122 lifetime: PhantomData<&'a dyn Serializer>,
1123}
1124
1125impl<'a> Struct<'a> {
1126 unsafe fn new<T>(data: T) -> Self
1127 where
1128 T: serde::ser::SerializeStruct,
1129 {
1130 Struct {
1131 data: unsafe { Any::new(data) },
1132 serialize_field: {
1133 unsafe fn serialize_field<T>(
1134 data: &mut Any,
1135 k: &'static str,
1136 v: &dyn Serialize,
1137 ) -> Result<(), Error>
1138 where
1139 T: serde::ser::SerializeStruct,
1140 {
1141 unsafe { data.view::<T>().serialize_field(k, v).map_err(erase) }
1142 }
1143 serialize_field::<T>
1144 },
1145 end: {
1146 unsafe fn end<T>(data: Any) -> Result<Ok, Error>
1147 where
1148 T: serde::ser::SerializeStruct,
1149 {
1150 unsafe { data.take::<T>().end().unsafe_map(Ok::new).map_err(erase) }
1151 }
1152 end::<T>
1153 },
1154 lifetime: PhantomData,
1155 }
1156 }
1157}
1158
1159impl<'a> SerializeStruct for Struct<'a> {
1160 type Ok = Ok;
1161 type Error = Error;
1162
1163 fn serialize_field<T>(&mut self, name: &'static str, field: &T) -> Result<(), Error>
1164 where
1165 T: ?Sized + serde::Serialize,
1166 {
1167 unsafe { (self.serialize_field)(&mut self.data, name, &field) }
1168 }
1169
1170 fn end(self) -> Result<Ok, Error> {
1171 unsafe { (self.end)(self.data) }
1172 }
1173}
1174
1175pub struct StructVariant<'a> {
1176 data: Any,
1177 serialize_field: unsafe fn(&mut Any, &'static str, &dyn Serialize) -> Result<(), Error>,
1178 end: unsafe fn(Any) -> Result<Ok, Error>,
1179 lifetime: PhantomData<&'a dyn Serializer>,
1180}
1181
1182impl<'a> StructVariant<'a> {
1183 unsafe fn new<T>(data: T) -> Self
1184 where
1185 T: serde::ser::SerializeStructVariant,
1186 {
1187 StructVariant {
1188 data: unsafe { Any::new(data) },
1189 serialize_field: {
1190 unsafe fn serialize_field<T>(
1191 data: &mut Any,
1192 k: &'static str,
1193 v: &dyn Serialize,
1194 ) -> Result<(), Error>
1195 where
1196 T: serde::ser::SerializeStructVariant,
1197 {
1198 unsafe { data.view::<T>().serialize_field(k, v).map_err(erase) }
1199 }
1200 serialize_field::<T>
1201 },
1202 end: {
1203 unsafe fn end<T>(data: Any) -> Result<Ok, Error>
1204 where
1205 T: serde::ser::SerializeStructVariant,
1206 {
1207 unsafe { data.take::<T>().end().unsafe_map(Ok::new).map_err(erase) }
1208 }
1209 end::<T>
1210 },
1211 lifetime: PhantomData,
1212 }
1213 }
1214}
1215
1216impl<'a> SerializeStructVariant for StructVariant<'a> {
1217 type Ok = Ok;
1218 type Error = Error;
1219
1220 fn serialize_field<T>(&mut self, name: &'static str, field: &T) -> Result<(), Error>
1221 where
1222 T: ?Sized + serde::Serialize,
1223 {
1224 unsafe { (self.serialize_field)(&mut self.data, name, &field) }
1225 }
1226
1227 fn end(self) -> Result<Ok, Error> {
1228 unsafe { (self.end)(self.data) }
1229 }
1230}
1231
1232macro_rules! deref_erased_serializer {
1235 ($($imp:tt)+) => {
1236 impl $($imp)+ {
1237 fn erased_serialize_bool(&mut self, v: bool) -> Result<Ok, Error> {
1238 (**self).erased_serialize_bool(v)
1239 }
1240
1241 fn erased_serialize_i8(&mut self, v: i8) -> Result<Ok, Error> {
1242 (**self).erased_serialize_i8(v)
1243 }
1244
1245 fn erased_serialize_i16(&mut self, v: i16) -> Result<Ok, Error> {
1246 (**self).erased_serialize_i16(v)
1247 }
1248
1249 fn erased_serialize_i32(&mut self, v: i32) -> Result<Ok, Error> {
1250 (**self).erased_serialize_i32(v)
1251 }
1252
1253 fn erased_serialize_i64(&mut self, v: i64) -> Result<Ok, Error> {
1254 (**self).erased_serialize_i64(v)
1255 }
1256
1257 fn erased_serialize_i128(&mut self, v: i128) -> Result<Ok, Error> {
1258 (**self).erased_serialize_i128(v)
1259 }
1260
1261 fn erased_serialize_u8(&mut self, v: u8) -> Result<Ok, Error> {
1262 (**self).erased_serialize_u8(v)
1263 }
1264
1265 fn erased_serialize_u16(&mut self, v: u16) -> Result<Ok, Error> {
1266 (**self).erased_serialize_u16(v)
1267 }
1268
1269 fn erased_serialize_u32(&mut self, v: u32) -> Result<Ok, Error> {
1270 (**self).erased_serialize_u32(v)
1271 }
1272
1273 fn erased_serialize_u64(&mut self, v: u64) -> Result<Ok, Error> {
1274 (**self).erased_serialize_u64(v)
1275 }
1276
1277 fn erased_serialize_u128(&mut self, v: u128) -> Result<Ok, Error> {
1278 (**self).erased_serialize_u128(v)
1279 }
1280
1281 fn erased_serialize_f32(&mut self, v: f32) -> Result<Ok, Error> {
1282 (**self).erased_serialize_f32(v)
1283 }
1284
1285 fn erased_serialize_f64(&mut self, v: f64) -> Result<Ok, Error> {
1286 (**self).erased_serialize_f64(v)
1287 }
1288
1289 fn erased_serialize_char(&mut self, v: char) -> Result<Ok, Error> {
1290 (**self).erased_serialize_char(v)
1291 }
1292
1293 fn erased_serialize_str(&mut self, v: &str) -> Result<Ok, Error> {
1294 (**self).erased_serialize_str(v)
1295 }
1296
1297 fn erased_serialize_bytes(&mut self, v: &[u8]) -> Result<Ok, Error> {
1298 (**self).erased_serialize_bytes(v)
1299 }
1300
1301 fn erased_serialize_none(&mut self) -> Result<Ok, Error> {
1302 (**self).erased_serialize_none()
1303 }
1304
1305 fn erased_serialize_some(&mut self, v: &dyn Serialize) -> Result<Ok, Error> {
1306 (**self).erased_serialize_some(v)
1307 }
1308
1309 fn erased_serialize_unit(&mut self) -> Result<Ok, Error> {
1310 (**self).erased_serialize_unit()
1311 }
1312
1313 fn erased_serialize_unit_struct(&mut self, name: &'static str) -> Result<Ok, Error> {
1314 (**self).erased_serialize_unit_struct(name)
1315 }
1316
1317 fn erased_serialize_unit_variant(&mut self, name: &'static str, variant_index: u32, variant: &'static str) -> Result<Ok, Error> {
1318 (**self).erased_serialize_unit_variant(name, variant_index, variant)
1319 }
1320
1321 fn erased_serialize_newtype_struct(&mut self, name: &'static str, v: &dyn Serialize) -> Result<Ok, Error> {
1322 (**self).erased_serialize_newtype_struct(name, v)
1323 }
1324
1325 fn erased_serialize_newtype_variant(&mut self, name: &'static str, variant_index: u32, variant: &'static str, v: &dyn Serialize) -> Result<Ok, Error> {
1326 (**self).erased_serialize_newtype_variant(name, variant_index, variant, v)
1327 }
1328
1329 fn erased_serialize_seq(&mut self, len: Option<usize>) -> Result<Seq, Error> {
1330 (**self).erased_serialize_seq(len)
1331 }
1332
1333 fn erased_serialize_tuple(&mut self, len: usize) -> Result<Tuple, Error> {
1334 (**self).erased_serialize_tuple(len)
1335 }
1336
1337 fn erased_serialize_tuple_struct(&mut self, name: &'static str, len: usize) -> Result<TupleStruct, Error> {
1338 (**self).erased_serialize_tuple_struct(name, len)
1339 }
1340
1341 fn erased_serialize_tuple_variant(&mut self, name: &'static str, variant_index: u32, variant: &'static str, len: usize) -> Result<TupleVariant, Error> {
1342 (**self).erased_serialize_tuple_variant(name, variant_index, variant, len)
1343 }
1344
1345 fn erased_serialize_map(&mut self, len: Option<usize>) -> Result<Map, Error> {
1346 (**self).erased_serialize_map(len)
1347 }
1348
1349 fn erased_serialize_struct(&mut self, name: &'static str, len: usize) -> Result<Struct, Error> {
1350 (**self).erased_serialize_struct(name, len)
1351 }
1352
1353 fn erased_serialize_struct_variant(&mut self, name: &'static str, variant_index: u32, variant: &'static str, len: usize) -> Result<StructVariant, Error> {
1354 (**self).erased_serialize_struct_variant(name, variant_index, variant, len)
1355 }
1356
1357 fn erased_is_human_readable(&self) -> bool {
1358 (**self).erased_is_human_readable()
1359 }
1360 }
1361 };
1362}
1363
1364deref_erased_serializer!(<'a> Serializer for Box<dyn Serializer + 'a>);
1365deref_erased_serializer!(<'a> Serializer for Box<dyn Serializer + Send + 'a>);
1366deref_erased_serializer!(<'a> Serializer for Box<dyn Serializer + Sync + 'a>);
1367deref_erased_serializer!(<'a> Serializer for Box<dyn Serializer + Send + Sync + 'a>);
1368deref_erased_serializer!(<'a, T: ?Sized + Serializer> Serializer for &'a mut T);
1369
1370fn erase<E>(e: E) -> Error
1373where
1374 E: Display,
1375{
1376 serde::ser::Error::custom(e)
1377}
1378
1379fn unerase<E>(e: Error) -> E
1380where
1381 E: serde::ser::Error,
1382{
1383 E::custom(e)
1384}
1385
1386#[cfg(test)]
1389mod tests {
1390 use super::*;
1391 use crate::alloc::{vec, Vec};
1392 use serde_derive::Serialize;
1393
1394 fn test_json<T>(t: T)
1395 where
1396 T: serde::Serialize,
1397 {
1398 let expected = serde_json::to_vec(&t).unwrap();
1399
1400 {
1402 let obj: &dyn Serialize = &t;
1403
1404 let mut buf = Vec::new();
1405
1406 {
1407 let mut ser = serde_json::Serializer::new(&mut buf);
1408 let ser: &mut dyn Serializer = &mut <dyn Serializer>::erase(&mut ser);
1409
1410 obj.erased_serialize(ser).unwrap();
1411 }
1412
1413 assert_eq!(buf, expected);
1414 }
1415
1416 {
1418 let obj: Box<dyn Serialize> = Box::new(t);
1419
1420 let mut buf = Vec::new();
1421
1422 {
1423 let mut ser = serde_json::Serializer::new(&mut buf);
1424 let mut ser: Box<dyn Serializer> = Box::new(<dyn Serializer>::erase(&mut ser));
1425
1426 obj.erased_serialize(&mut ser).unwrap();
1427 }
1428
1429 assert_eq!(buf, expected);
1430 }
1431 }
1432
1433 #[test]
1434 fn test_vec() {
1435 test_json(vec!["a", "b"]);
1436 }
1437
1438 #[test]
1439 fn test_struct() {
1440 #[derive(Serialize)]
1441 struct S {
1442 f: usize,
1443 }
1444
1445 test_json(S { f: 256 });
1446 }
1447
1448 #[test]
1449 fn test_enum() {
1450 #[derive(Serialize)]
1451 enum E {
1452 Unit,
1453 Newtype(bool),
1454 Tuple(bool, bool),
1455 Struct { t: bool, f: bool },
1456 }
1457
1458 test_json(E::Unit);
1459 test_json(E::Newtype(true));
1460 test_json(E::Tuple(true, false));
1461 test_json(E::Struct { t: true, f: false });
1462 }
1463
1464 #[test]
1465 fn assert_serialize() {
1466 fn assert<T: serde::Serialize>() {}
1467
1468 assert::<&dyn Serialize>();
1469 assert::<&(dyn Serialize + Send)>();
1470 assert::<&(dyn Serialize + Sync)>();
1471 assert::<&(dyn Serialize + Send + Sync)>();
1472 assert::<&(dyn Serialize + Sync + Send)>();
1473 assert::<Vec<&dyn Serialize>>();
1474 assert::<Vec<&(dyn Serialize + Send)>>();
1475
1476 assert::<Box<dyn Serialize>>();
1477 assert::<Box<dyn Serialize + Send>>();
1478 assert::<Box<dyn Serialize + Sync>>();
1479 assert::<Box<dyn Serialize + Send + Sync>>();
1480 assert::<Box<dyn Serialize + Sync + Send>>();
1481 assert::<Vec<Box<dyn Serialize>>>();
1482 assert::<Vec<Box<dyn Serialize + Send>>>();
1483 }
1484
1485 #[test]
1486 fn assert_serializer() {
1487 fn assert<T: serde::Serializer>() {}
1488
1489 assert::<&mut dyn Serializer>();
1490 assert::<&mut (dyn Serializer + Send)>();
1491 assert::<&mut (dyn Serializer + Sync)>();
1492 assert::<&mut (dyn Serializer + Send + Sync)>();
1493 assert::<&mut (dyn Serializer + Sync + Send)>();
1494 }
1495}