1use self::ErrorImpl::ShortCircuit;
2use crate::error::Error;
3use crate::sealed;
4use alloc::boxed::Box;
5use alloc::string::{String, ToString};
6use core::fmt::{self, Debug, Display};
7use serde::ser::{
8 SerializeMap as _, SerializeSeq as _, SerializeStruct as _, SerializeStructVariant as _,
9 SerializeTuple as _, SerializeTupleStruct as _, SerializeTupleVariant as _,
10};
11
12#[cfg_attr(
57 not(no_diagnostic_namespace),
58 diagnostic::on_unimplemented(
59 message = "the trait bound `{Self}: serde::Serialize` is not satisfied",
60 label = "the trait `serde::Serialize` is not implemented for `{Self}`, so it does not implement `erased_serde::Serialize`",
61 )
62)]
63pub trait Serialize: sealed::serialize::Sealed {
64 fn erased_serialize(&self, serializer: &mut dyn Serializer) -> Result<(), Error>;
65
66 #[doc(hidden)]
67 fn do_erased_serialize(&self, serializer: &mut dyn Serializer) -> Result<(), ErrorImpl>;
68}
69
70pub trait Serializer: sealed::serializer::Sealed {
113 fn erased_serialize_bool(&mut self, v: bool);
114 fn erased_serialize_i8(&mut self, v: i8);
115 fn erased_serialize_i16(&mut self, v: i16);
116 fn erased_serialize_i32(&mut self, v: i32);
117 fn erased_serialize_i64(&mut self, v: i64);
118 fn erased_serialize_i128(&mut self, v: i128);
119 fn erased_serialize_u8(&mut self, v: u8);
120 fn erased_serialize_u16(&mut self, v: u16);
121 fn erased_serialize_u32(&mut self, v: u32);
122 fn erased_serialize_u64(&mut self, v: u64);
123 fn erased_serialize_u128(&mut self, v: u128);
124 fn erased_serialize_f32(&mut self, v: f32);
125 fn erased_serialize_f64(&mut self, v: f64);
126 fn erased_serialize_char(&mut self, v: char);
127 fn erased_serialize_str(&mut self, v: &str);
128 fn erased_serialize_bytes(&mut self, v: &[u8]);
129 fn erased_serialize_none(&mut self);
130 fn erased_serialize_some(&mut self, value: &dyn Serialize);
131 fn erased_serialize_unit(&mut self);
132 fn erased_serialize_unit_struct(&mut self, name: &'static str);
133 fn erased_serialize_unit_variant(
134 &mut self,
135 name: &'static str,
136 variant_index: u32,
137 variant: &'static str,
138 );
139 fn erased_serialize_newtype_struct(&mut self, name: &'static str, value: &dyn Serialize);
140 fn erased_serialize_newtype_variant(
141 &mut self,
142 name: &'static str,
143 variant_index: u32,
144 variant: &'static str,
145 value: &dyn Serialize,
146 );
147 fn erased_serialize_seq(
148 &mut self,
149 len: Option<usize>,
150 ) -> Result<&mut dyn SerializeSeq, ErrorImpl>;
151 fn erased_serialize_tuple(&mut self, len: usize) -> Result<&mut dyn SerializeTuple, ErrorImpl>;
152 fn erased_serialize_tuple_struct(
153 &mut self,
154 name: &'static str,
155 len: usize,
156 ) -> Result<&mut dyn SerializeTupleStruct, ErrorImpl>;
157 fn erased_serialize_tuple_variant(
158 &mut self,
159 name: &'static str,
160 variant_index: u32,
161 variant: &'static str,
162 len: usize,
163 ) -> Result<&mut dyn SerializeTupleVariant, ErrorImpl>;
164 fn erased_serialize_map(
165 &mut self,
166 len: Option<usize>,
167 ) -> Result<&mut dyn SerializeMap, ErrorImpl>;
168 fn erased_serialize_struct(
169 &mut self,
170 name: &'static str,
171 len: usize,
172 ) -> Result<&mut dyn SerializeStruct, ErrorImpl>;
173 fn erased_serialize_struct_variant(
174 &mut self,
175 name: &'static str,
176 variant_index: u32,
177 variant: &'static str,
178 len: usize,
179 ) -> Result<&mut dyn SerializeStructVariant, ErrorImpl>;
180 fn erased_collect_str(&mut self, value: &dyn Display);
181 fn erased_is_human_readable(&self) -> bool;
182 #[doc(hidden)]
183 fn erased_display_error(&self) -> &dyn Display;
184}
185
186impl dyn Serializer {
187 #[doc = r" Convert any Serde `Serializer` to a trait object."]
#[doc = r""]
#[doc = r" ```rust"]
#[doc = r" use erased_serde::{Serialize, Serializer};"]
#[doc = r" use std::collections::BTreeMap as Map;"]
#[doc = r" use std::io;"]
#[doc = r""]
#[doc = r" fn main() {"]
#[doc = r" // Construct some serializers."]
#[doc = r" let json = &mut serde_json::Serializer::new(io::stdout());"]
#[doc =
r" let cbor = &mut serde_cbor::Serializer::new(serde_cbor::ser::IoWrite::new(io::stdout()));"]
#[doc = r""]
#[doc =
r" // The values in this map are boxed trait objects. Ordinarily this would not"]
#[doc =
r" // be possible with serde::Serializer because of object safety, but type"]
#[doc = r" // erasure makes it possible with erased_serde::Serializer."]
#[doc = r" let mut formats: Map<&str, Box<dyn Serializer>> = Map::new();"]
#[doc =
r#" formats.insert("json", Box::new(<dyn Serializer>::erase(json)));"#]
#[doc =
r#" formats.insert("cbor", Box::new(<dyn Serializer>::erase(cbor)));"#]
#[doc = r""]
#[doc =
r" // These are boxed trait objects as well. Same thing here - type erasure"]
#[doc = r" // makes this possible."]
#[doc = r" let mut values: Map<&str, Box<dyn Serialize>> = Map::new();"]
#[doc = r#" values.insert("vec", Box::new(vec!["a", "b"]));"#]
#[doc = r#" values.insert("int", Box::new(65536));"#]
#[doc = r""]
#[doc = r" // Pick a Serializer out of the formats map."]
#[doc = r#" let format = formats.get_mut("json").unwrap();"#]
#[doc = r""]
#[doc = r" // Pick a Serialize out of the values map."]
#[doc = r#" let value = values.get("vec").unwrap();"#]
#[doc = r""]
#[doc = r#" // This line prints `["a","b"]` to stdout."#]
#[doc = r" value.erased_serialize(format).unwrap();"]
#[doc = r" }"]
#[doc = r" ```"]
pub fn erase<S>(serializer: S) -> impl Serializer where S: serde::Serializer {
erase::Serializer::new(serializer)
}return_impl_trait! {
188 pub fn erase<S>(serializer: S) -> impl Serializer [erase::Serializer<S>]
224 where
225 S: serde::Serializer,
226 {
227 erase::Serializer::new(serializer)
228 }
229 }
230}
231
232impl<T> Serialize for T
235where
236 T: ?Sized + serde::Serialize,
237{
238 fn erased_serialize(&self, serializer: &mut dyn Serializer) -> Result<(), Error> {
239 match self.do_erased_serialize(serializer) {
240 Ok(()) => Ok(()),
241 Err(ShortCircuit) => Err(serde::ser::Error::custom(serializer.erased_display_error())),
242 Err(ErrorImpl::Custom(msg)) => Err(serde::ser::Error::custom(msg)),
243 }
244 }
245
246 fn do_erased_serialize(&self, serializer: &mut dyn Serializer) -> Result<(), ErrorImpl> {
247 self.serialize(MakeSerializer(serializer))
248 }
249}
250
251impl<T> sealed::serialize::Sealed for T where T: ?Sized + serde::Serialize {}
252
253mod erase {
254 use core::mem;
255
256 pub enum Serializer<S>
257 where
258 S: serde::Serializer,
259 {
260 Ready(S),
261 Seq(S::SerializeSeq),
262 Tuple(S::SerializeTuple),
263 TupleStruct(S::SerializeTupleStruct),
264 TupleVariant(S::SerializeTupleVariant),
265 Map(S::SerializeMap),
266 Struct(S::SerializeStruct),
267 StructVariant(S::SerializeStructVariant),
268 Error(S::Error),
269 Complete(S::Ok),
270 Unusable,
271 }
272
273 impl<S> Serializer<S>
274 where
275 S: serde::Serializer,
276 {
277 pub(crate) fn new(serializer: S) -> Self {
278 Serializer::Ready(serializer)
279 }
280
281 pub(crate) fn take(&mut self) -> Self {
282 mem::replace(self, Serializer::Unusable)
283 }
284
285 pub(crate) fn take_serializer(&mut self) -> S {
286 match self.take() {
287 Serializer::Ready(serializer) => serializer,
288 _ => ::core::panicking::unreachable_default_msg()unreachable!(),
289 }
290 }
291 }
292}
293
294impl<T> Serializer for erase::Serializer<T>
295where
296 T: serde::Serializer,
297{
298 fn erased_serialize_bool(&mut self, v: bool) {
299 *self = match self.take_serializer().serialize_bool(v) {
300 Ok(ok) => erase::Serializer::Complete(ok),
301 Err(err) => erase::Serializer::Error(err),
302 };
303 }
304
305 fn erased_serialize_i8(&mut self, v: i8) {
306 *self = match self.take_serializer().serialize_i8(v) {
307 Ok(ok) => erase::Serializer::Complete(ok),
308 Err(err) => erase::Serializer::Error(err),
309 };
310 }
311
312 fn erased_serialize_i16(&mut self, v: i16) {
313 *self = match self.take_serializer().serialize_i16(v) {
314 Ok(ok) => erase::Serializer::Complete(ok),
315 Err(err) => erase::Serializer::Error(err),
316 };
317 }
318
319 fn erased_serialize_i32(&mut self, v: i32) {
320 *self = match self.take_serializer().serialize_i32(v) {
321 Ok(ok) => erase::Serializer::Complete(ok),
322 Err(err) => erase::Serializer::Error(err),
323 };
324 }
325
326 fn erased_serialize_i64(&mut self, v: i64) {
327 *self = match self.take_serializer().serialize_i64(v) {
328 Ok(ok) => erase::Serializer::Complete(ok),
329 Err(err) => erase::Serializer::Error(err),
330 };
331 }
332
333 fn erased_serialize_i128(&mut self, v: i128) {
334 *self = match self.take_serializer().serialize_i128(v) {
335 Ok(ok) => erase::Serializer::Complete(ok),
336 Err(err) => erase::Serializer::Error(err),
337 };
338 }
339
340 fn erased_serialize_u8(&mut self, v: u8) {
341 *self = match self.take_serializer().serialize_u8(v) {
342 Ok(ok) => erase::Serializer::Complete(ok),
343 Err(err) => erase::Serializer::Error(err),
344 };
345 }
346
347 fn erased_serialize_u16(&mut self, v: u16) {
348 *self = match self.take_serializer().serialize_u16(v) {
349 Ok(ok) => erase::Serializer::Complete(ok),
350 Err(err) => erase::Serializer::Error(err),
351 };
352 }
353
354 fn erased_serialize_u32(&mut self, v: u32) {
355 *self = match self.take_serializer().serialize_u32(v) {
356 Ok(ok) => erase::Serializer::Complete(ok),
357 Err(err) => erase::Serializer::Error(err),
358 };
359 }
360
361 fn erased_serialize_u64(&mut self, v: u64) {
362 *self = match self.take_serializer().serialize_u64(v) {
363 Ok(ok) => erase::Serializer::Complete(ok),
364 Err(err) => erase::Serializer::Error(err),
365 };
366 }
367
368 fn erased_serialize_u128(&mut self, v: u128) {
369 *self = match self.take_serializer().serialize_u128(v) {
370 Ok(ok) => erase::Serializer::Complete(ok),
371 Err(err) => erase::Serializer::Error(err),
372 };
373 }
374
375 fn erased_serialize_f32(&mut self, v: f32) {
376 *self = match self.take_serializer().serialize_f32(v) {
377 Ok(ok) => erase::Serializer::Complete(ok),
378 Err(err) => erase::Serializer::Error(err),
379 };
380 }
381
382 fn erased_serialize_f64(&mut self, v: f64) {
383 *self = match self.take_serializer().serialize_f64(v) {
384 Ok(ok) => erase::Serializer::Complete(ok),
385 Err(err) => erase::Serializer::Error(err),
386 };
387 }
388
389 fn erased_serialize_char(&mut self, v: char) {
390 *self = match self.take_serializer().serialize_char(v) {
391 Ok(ok) => erase::Serializer::Complete(ok),
392 Err(err) => erase::Serializer::Error(err),
393 };
394 }
395
396 fn erased_serialize_str(&mut self, v: &str) {
397 *self = match self.take_serializer().serialize_str(v) {
398 Ok(ok) => erase::Serializer::Complete(ok),
399 Err(err) => erase::Serializer::Error(err),
400 };
401 }
402
403 fn erased_serialize_bytes(&mut self, v: &[u8]) {
404 *self = match self.take_serializer().serialize_bytes(v) {
405 Ok(ok) => erase::Serializer::Complete(ok),
406 Err(err) => erase::Serializer::Error(err),
407 };
408 }
409
410 fn erased_serialize_none(&mut self) {
411 *self = match self.take_serializer().serialize_none() {
412 Ok(ok) => erase::Serializer::Complete(ok),
413 Err(err) => erase::Serializer::Error(err),
414 };
415 }
416
417 fn erased_serialize_some(&mut self, value: &dyn Serialize) {
418 *self = match self.take_serializer().serialize_some(value) {
419 Ok(ok) => erase::Serializer::Complete(ok),
420 Err(err) => erase::Serializer::Error(err),
421 };
422 }
423
424 fn erased_serialize_unit(&mut self) {
425 *self = match self.take_serializer().serialize_unit() {
426 Ok(ok) => erase::Serializer::Complete(ok),
427 Err(err) => erase::Serializer::Error(err),
428 };
429 }
430
431 fn erased_serialize_unit_struct(&mut self, name: &'static str) {
432 *self = match self.take_serializer().serialize_unit_struct(name) {
433 Ok(ok) => erase::Serializer::Complete(ok),
434 Err(err) => erase::Serializer::Error(err),
435 };
436 }
437
438 fn erased_serialize_unit_variant(
439 &mut self,
440 name: &'static str,
441 variant_index: u32,
442 variant: &'static str,
443 ) {
444 *self = match self
445 .take_serializer()
446 .serialize_unit_variant(name, variant_index, variant)
447 {
448 Ok(ok) => erase::Serializer::Complete(ok),
449 Err(err) => erase::Serializer::Error(err),
450 };
451 }
452
453 fn erased_serialize_newtype_struct(&mut self, name: &'static str, value: &dyn Serialize) {
454 *self = match self.take_serializer().serialize_newtype_struct(name, value) {
455 Ok(ok) => erase::Serializer::Complete(ok),
456 Err(err) => erase::Serializer::Error(err),
457 };
458 }
459
460 fn erased_serialize_newtype_variant(
461 &mut self,
462 name: &'static str,
463 variant_index: u32,
464 variant: &'static str,
465 value: &dyn Serialize,
466 ) {
467 *self = match self.take_serializer().serialize_newtype_variant(
468 name,
469 variant_index,
470 variant,
471 value,
472 ) {
473 Ok(ok) => erase::Serializer::Complete(ok),
474 Err(err) => erase::Serializer::Error(err),
475 };
476 }
477
478 fn erased_serialize_seq(
479 &mut self,
480 len: Option<usize>,
481 ) -> Result<&mut dyn SerializeSeq, ErrorImpl> {
482 match self.take_serializer().serialize_seq(len) {
483 Ok(ok) => {
484 *self = erase::Serializer::Seq(ok);
485 Ok(self)
486 }
487 Err(err) => {
488 *self = erase::Serializer::Error(err);
489 Err(ShortCircuit)
490 }
491 }
492 }
493
494 fn erased_serialize_tuple(&mut self, len: usize) -> Result<&mut dyn SerializeTuple, ErrorImpl> {
495 match self.take_serializer().serialize_tuple(len) {
496 Ok(ok) => {
497 *self = erase::Serializer::Tuple(ok);
498 Ok(self)
499 }
500 Err(err) => {
501 *self = erase::Serializer::Error(err);
502 Err(ShortCircuit)
503 }
504 }
505 }
506
507 fn erased_serialize_tuple_struct(
508 &mut self,
509 name: &'static str,
510 len: usize,
511 ) -> Result<&mut dyn SerializeTupleStruct, ErrorImpl> {
512 match self.take_serializer().serialize_tuple_struct(name, len) {
513 Ok(ok) => {
514 *self = erase::Serializer::TupleStruct(ok);
515 Ok(self)
516 }
517 Err(err) => {
518 *self = erase::Serializer::Error(err);
519 Err(ShortCircuit)
520 }
521 }
522 }
523
524 fn erased_serialize_tuple_variant(
525 &mut self,
526 name: &'static str,
527 variant_index: u32,
528 variant: &'static str,
529 len: usize,
530 ) -> Result<&mut dyn SerializeTupleVariant, ErrorImpl> {
531 match self
532 .take_serializer()
533 .serialize_tuple_variant(name, variant_index, variant, len)
534 {
535 Ok(ok) => {
536 *self = erase::Serializer::TupleVariant(ok);
537 Ok(self)
538 }
539 Err(err) => {
540 *self = erase::Serializer::Error(err);
541 Err(ShortCircuit)
542 }
543 }
544 }
545
546 fn erased_serialize_map(
547 &mut self,
548 len: Option<usize>,
549 ) -> Result<&mut dyn SerializeMap, ErrorImpl> {
550 match self.take_serializer().serialize_map(len) {
551 Ok(ok) => {
552 *self = erase::Serializer::Map(ok);
553 Ok(self)
554 }
555 Err(err) => {
556 *self = erase::Serializer::Error(err);
557 Err(ShortCircuit)
558 }
559 }
560 }
561
562 fn erased_serialize_struct(
563 &mut self,
564 name: &'static str,
565 len: usize,
566 ) -> Result<&mut dyn SerializeStruct, ErrorImpl> {
567 match self.take_serializer().serialize_struct(name, len) {
568 Ok(ok) => {
569 *self = erase::Serializer::Struct(ok);
570 Ok(self)
571 }
572 Err(err) => {
573 *self = erase::Serializer::Error(err);
574 Err(ShortCircuit)
575 }
576 }
577 }
578
579 fn erased_serialize_struct_variant(
580 &mut self,
581 name: &'static str,
582 variant_index: u32,
583 variant: &'static str,
584 len: usize,
585 ) -> Result<&mut dyn SerializeStructVariant, ErrorImpl> {
586 match self
587 .take_serializer()
588 .serialize_struct_variant(name, variant_index, variant, len)
589 {
590 Ok(ok) => {
591 *self = erase::Serializer::StructVariant(ok);
592 Ok(self)
593 }
594 Err(err) => {
595 *self = erase::Serializer::Error(err);
596 Err(ShortCircuit)
597 }
598 }
599 }
600
601 fn erased_collect_str(&mut self, value: &dyn Display) {
602 *self = match self.take_serializer().collect_str(value) {
603 Ok(ok) => erase::Serializer::Complete(ok),
604 Err(err) => erase::Serializer::Error(err),
605 };
606 }
607
608 fn erased_is_human_readable(&self) -> bool {
609 match self {
610 erase::Serializer::Ready(serializer) => serializer.is_human_readable(),
611 _ => ::core::panicking::unreachable_default_msg()unreachable!(),
612 }
613 }
614
615 fn erased_display_error(&self) -> &dyn Display {
616 match self {
617 erase::Serializer::Error(err) => err,
618 _ => ::core::panicking::unreachable_default_msg()unreachable!(),
619 }
620 }
621}
622
623impl<T> sealed::serializer::Sealed for erase::Serializer<T> where T: serde::Serializer {}
624
625pub enum ErrorImpl {
626 ShortCircuit,
627 Custom(Box<String>),
628}
629
630impl Display for ErrorImpl {
631 fn fmt(&self, _formatter: &mut fmt::Formatter) -> fmt::Result {
632 ::core::panicking::unimplemented_default_msg()unimplemented!()
633 }
634}
635
636impl Debug for ErrorImpl {
637 fn fmt(&self, _formatter: &mut fmt::Formatter) -> fmt::Result {
638 ::core::panicking::unimplemented_default_msg()unimplemented!()
639 }
640}
641
642impl serde::ser::StdError for ErrorImpl {}
643
644impl serde::ser::Error for ErrorImpl {
645 fn custom<T: Display>(msg: T) -> Self {
646 ErrorImpl::Custom(Box::new(msg.to_string()))
647 }
648}
649
650pub fn serialize<T, S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
683where
684 T: ?Sized + Serialize,
685 S: serde::Serializer,
686{
687 let mut erased = erase::Serializer::new(serializer);
688 match value.do_erased_serialize(&mut erased) {
689 Ok(()) | Err(ShortCircuit) => {}
690 Err(ErrorImpl::Custom(msg)) => return Err(serde::ser::Error::custom(msg)),
691 }
692 match erased {
693 erase::Serializer::Complete(ok) => Ok(ok),
694 erase::Serializer::Error(err) => Err(err),
695 _ => ::core::panicking::unreachable_default_msg()unreachable!(),
696 }
697}
698
699impl<'erased> crate::__private::serde::Serialize for
dyn Serialize + crate::__private::Send + crate::__private::Sync + 'erased
where {
fn serialize<S>(&self, serializer: S)
-> crate::__private::Result<S::Ok, S::Error> where
S: crate::__private::serde::Serializer {
crate::serialize(self, serializer)
}
}serialize_trait_object!(Serialize);
700
701struct MakeSerializer<TraitObject>(TraitObject);
702
703impl<'a> serde::Serializer for MakeSerializer<&'a mut (dyn Serializer + '_)> {
704 type Ok = ();
705 type Error = ErrorImpl;
706 type SerializeSeq = MakeSerializer<&'a mut dyn SerializeSeq>;
707 type SerializeTuple = MakeSerializer<&'a mut dyn SerializeTuple>;
708 type SerializeTupleStruct = MakeSerializer<&'a mut dyn SerializeTupleStruct>;
709 type SerializeTupleVariant = MakeSerializer<&'a mut dyn SerializeTupleVariant>;
710 type SerializeMap = MakeSerializer<&'a mut dyn SerializeMap>;
711 type SerializeStruct = MakeSerializer<&'a mut dyn SerializeStruct>;
712 type SerializeStructVariant = MakeSerializer<&'a mut dyn SerializeStructVariant>;
713
714 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
715 self.0.erased_serialize_bool(v);
716 Ok(())
717 }
718
719 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
720 self.0.erased_serialize_i8(v);
721 Ok(())
722 }
723
724 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
725 self.0.erased_serialize_i16(v);
726 Ok(())
727 }
728
729 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
730 self.0.erased_serialize_i32(v);
731 Ok(())
732 }
733
734 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
735 self.0.erased_serialize_i64(v);
736 Ok(())
737 }
738
739 fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
740 self.0.erased_serialize_i128(v);
741 Ok(())
742 }
743
744 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
745 self.0.erased_serialize_u8(v);
746 Ok(())
747 }
748
749 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
750 self.0.erased_serialize_u16(v);
751 Ok(())
752 }
753
754 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
755 self.0.erased_serialize_u32(v);
756 Ok(())
757 }
758
759 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
760 self.0.erased_serialize_u64(v);
761 Ok(())
762 }
763
764 fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
765 self.0.erased_serialize_u128(v);
766 Ok(())
767 }
768
769 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
770 self.0.erased_serialize_f32(v);
771 Ok(())
772 }
773
774 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
775 self.0.erased_serialize_f64(v);
776 Ok(())
777 }
778
779 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
780 self.0.erased_serialize_char(v);
781 Ok(())
782 }
783
784 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
785 self.0.erased_serialize_str(v);
786 Ok(())
787 }
788
789 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
790 self.0.erased_serialize_bytes(v);
791 Ok(())
792 }
793
794 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
795 self.0.erased_serialize_none();
796 Ok(())
797 }
798
799 fn serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
800 where
801 T: ?Sized + serde::Serialize,
802 {
803 self.0.erased_serialize_some(&value);
804 Ok(())
805 }
806
807 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
808 self.0.erased_serialize_unit();
809 Ok(())
810 }
811
812 fn serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok, Self::Error> {
813 self.0.erased_serialize_unit_struct(name);
814 Ok(())
815 }
816
817 fn serialize_unit_variant(
818 self,
819 name: &'static str,
820 variant_index: u32,
821 variant: &'static str,
822 ) -> Result<Self::Ok, Self::Error> {
823 self.0
824 .erased_serialize_unit_variant(name, variant_index, variant);
825 Ok(())
826 }
827
828 fn serialize_newtype_struct<T>(
829 self,
830 name: &'static str,
831 value: &T,
832 ) -> Result<Self::Ok, Self::Error>
833 where
834 T: ?Sized + serde::Serialize,
835 {
836 self.0.erased_serialize_newtype_struct(name, &value);
837 Ok(())
838 }
839
840 fn serialize_newtype_variant<T>(
841 self,
842 name: &'static str,
843 variant_index: u32,
844 variant: &'static str,
845 value: &T,
846 ) -> Result<Self::Ok, Self::Error>
847 where
848 T: ?Sized + serde::Serialize,
849 {
850 self.0
851 .erased_serialize_newtype_variant(name, variant_index, variant, &value);
852 Ok(())
853 }
854
855 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
856 self.0.erased_serialize_seq(len).map(MakeSerializer)
857 }
858
859 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
860 self.0.erased_serialize_tuple(len).map(MakeSerializer)
861 }
862
863 fn serialize_tuple_struct(
864 self,
865 name: &'static str,
866 len: usize,
867 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
868 self.0
869 .erased_serialize_tuple_struct(name, len)
870 .map(MakeSerializer)
871 }
872
873 fn serialize_tuple_variant(
874 self,
875 name: &'static str,
876 variant_index: u32,
877 variant: &'static str,
878 len: usize,
879 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
880 self.0
881 .erased_serialize_tuple_variant(name, variant_index, variant, len)
882 .map(MakeSerializer)
883 }
884
885 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
886 self.0.erased_serialize_map(len).map(MakeSerializer)
887 }
888
889 fn serialize_struct(
890 self,
891 name: &'static str,
892 len: usize,
893 ) -> Result<Self::SerializeStruct, Self::Error> {
894 self.0
895 .erased_serialize_struct(name, len)
896 .map(MakeSerializer)
897 }
898
899 fn serialize_struct_variant(
900 self,
901 name: &'static str,
902 variant_index: u32,
903 variant: &'static str,
904 len: usize,
905 ) -> Result<Self::SerializeStructVariant, Self::Error> {
906 self.0
907 .erased_serialize_struct_variant(name, variant_index, variant, len)
908 .map(MakeSerializer)
909 }
910
911 fn collect_str<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
912 where
913 T: ?Sized + Display,
914 {
915 self.0.erased_collect_str(&value);
916 Ok(())
917 }
918
919 fn is_human_readable(&self) -> bool {
920 self.0.erased_is_human_readable()
921 }
922}
923
924pub trait SerializeSeq {
925 fn erased_serialize_element(&mut self, value: &dyn Serialize) -> Result<(), ErrorImpl>;
926 fn erased_end(&mut self);
927}
928
929impl<T> SerializeSeq for erase::Serializer<T>
930where
931 T: serde::Serializer,
932{
933 fn erased_serialize_element(&mut self, value: &dyn Serialize) -> Result<(), ErrorImpl> {
934 let erase::Serializer::Seq(serializer) = self else {
935 ::core::panicking::unreachable_default_msg();unreachable!();
936 };
937 serializer.serialize_element(value).map_err(|err| {
938 *self = erase::Serializer::Error(err);
939 ShortCircuit
940 })
941 }
942
943 fn erased_end(&mut self) {
944 let erase::Serializer::Seq(serializer) = self.take() else {
945 ::core::panicking::unreachable_default_msg();unreachable!();
946 };
947 *self = match serializer.end() {
948 Ok(ok) => erase::Serializer::Complete(ok),
949 Err(err) => erase::Serializer::Error(err),
950 };
951 }
952}
953
954impl serde::ser::SerializeSeq for MakeSerializer<&mut dyn SerializeSeq> {
955 type Ok = ();
956 type Error = ErrorImpl;
957
958 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
959 where
960 T: ?Sized + serde::Serialize,
961 {
962 self.0.erased_serialize_element(&value)
963 }
964
965 fn end(self) -> Result<Self::Ok, Self::Error> {
966 self.0.erased_end();
967 Ok(())
968 }
969}
970
971pub trait SerializeTuple {
972 fn erased_serialize_element(&mut self, value: &dyn Serialize) -> Result<(), ErrorImpl>;
973 fn erased_end(&mut self);
974}
975
976impl<T> SerializeTuple for erase::Serializer<T>
977where
978 T: serde::Serializer,
979{
980 fn erased_serialize_element(&mut self, value: &dyn Serialize) -> Result<(), ErrorImpl> {
981 let erase::Serializer::Tuple(serializer) = self else {
982 ::core::panicking::unreachable_default_msg();unreachable!();
983 };
984 serializer.serialize_element(value).map_err(|err| {
985 *self = erase::Serializer::Error(err);
986 ShortCircuit
987 })
988 }
989
990 fn erased_end(&mut self) {
991 let erase::Serializer::Tuple(serializer) = self.take() else {
992 ::core::panicking::unreachable_default_msg();unreachable!();
993 };
994 *self = match serializer.end() {
995 Ok(ok) => erase::Serializer::Complete(ok),
996 Err(err) => erase::Serializer::Error(err),
997 };
998 }
999}
1000
1001impl serde::ser::SerializeTuple for MakeSerializer<&mut dyn SerializeTuple> {
1002 type Ok = ();
1003 type Error = ErrorImpl;
1004
1005 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
1006 where
1007 T: ?Sized + serde::Serialize,
1008 {
1009 self.0.erased_serialize_element(&value)
1010 }
1011
1012 fn end(self) -> Result<Self::Ok, Self::Error> {
1013 self.0.erased_end();
1014 Ok(())
1015 }
1016}
1017
1018pub trait SerializeTupleStruct {
1019 fn erased_serialize_field(&mut self, value: &dyn Serialize) -> Result<(), ErrorImpl>;
1020 fn erased_end(&mut self);
1021}
1022
1023impl<T> SerializeTupleStruct for erase::Serializer<T>
1024where
1025 T: serde::Serializer,
1026{
1027 fn erased_serialize_field(&mut self, value: &dyn Serialize) -> Result<(), ErrorImpl> {
1028 let erase::Serializer::TupleStruct(serializer) = self else {
1029 ::core::panicking::unreachable_default_msg();unreachable!();
1030 };
1031 serializer.serialize_field(value).map_err(|err| {
1032 *self = erase::Serializer::Error(err);
1033 ShortCircuit
1034 })
1035 }
1036
1037 fn erased_end(&mut self) {
1038 let erase::Serializer::TupleStruct(serializer) = self.take() else {
1039 ::core::panicking::unreachable_default_msg();unreachable!();
1040 };
1041 *self = match serializer.end() {
1042 Ok(ok) => erase::Serializer::Complete(ok),
1043 Err(err) => erase::Serializer::Error(err),
1044 };
1045 }
1046}
1047
1048impl serde::ser::SerializeTupleStruct for MakeSerializer<&mut dyn SerializeTupleStruct> {
1049 type Ok = ();
1050 type Error = ErrorImpl;
1051
1052 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
1053 where
1054 T: ?Sized + serde::Serialize,
1055 {
1056 self.0.erased_serialize_field(&value)
1057 }
1058
1059 fn end(self) -> Result<Self::Ok, Self::Error> {
1060 self.0.erased_end();
1061 Ok(())
1062 }
1063}
1064
1065pub trait SerializeTupleVariant {
1066 fn erased_serialize_field(&mut self, value: &dyn Serialize) -> Result<(), ErrorImpl>;
1067 fn erased_end(&mut self);
1068}
1069
1070impl<T> SerializeTupleVariant for erase::Serializer<T>
1071where
1072 T: serde::Serializer,
1073{
1074 fn erased_serialize_field(&mut self, value: &dyn Serialize) -> Result<(), ErrorImpl> {
1075 let erase::Serializer::TupleVariant(serializer) = self else {
1076 ::core::panicking::unreachable_default_msg();unreachable!();
1077 };
1078 serializer.serialize_field(value).map_err(|err| {
1079 *self = erase::Serializer::Error(err);
1080 ShortCircuit
1081 })
1082 }
1083
1084 fn erased_end(&mut self) {
1085 let erase::Serializer::TupleVariant(serializer) = self.take() else {
1086 ::core::panicking::unreachable_default_msg();unreachable!();
1087 };
1088 *self = match serializer.end() {
1089 Ok(ok) => erase::Serializer::Complete(ok),
1090 Err(err) => erase::Serializer::Error(err),
1091 };
1092 }
1093}
1094
1095impl serde::ser::SerializeTupleVariant for MakeSerializer<&mut dyn SerializeTupleVariant> {
1096 type Ok = ();
1097 type Error = ErrorImpl;
1098
1099 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
1100 where
1101 T: ?Sized + serde::Serialize,
1102 {
1103 self.0.erased_serialize_field(&value)
1104 }
1105
1106 fn end(self) -> Result<Self::Ok, Self::Error> {
1107 self.0.erased_end();
1108 Ok(())
1109 }
1110}
1111
1112pub trait SerializeMap {
1113 fn erased_serialize_key(&mut self, key: &dyn Serialize) -> Result<(), ErrorImpl>;
1114 fn erased_serialize_value(&mut self, value: &dyn Serialize) -> Result<(), ErrorImpl>;
1115 fn erased_serialize_entry(
1116 &mut self,
1117 key: &dyn Serialize,
1118 value: &dyn Serialize,
1119 ) -> Result<(), ErrorImpl>;
1120 fn erased_end(&mut self);
1121}
1122
1123impl<T> SerializeMap for erase::Serializer<T>
1124where
1125 T: serde::Serializer,
1126{
1127 fn erased_serialize_key(&mut self, key: &dyn Serialize) -> Result<(), ErrorImpl> {
1128 let erase::Serializer::Map(serializer) = self else {
1129 ::core::panicking::unreachable_default_msg();unreachable!();
1130 };
1131 serializer.serialize_key(key).map_err(|err| {
1132 *self = erase::Serializer::Error(err);
1133 ShortCircuit
1134 })
1135 }
1136
1137 fn erased_serialize_value(&mut self, value: &dyn Serialize) -> Result<(), ErrorImpl> {
1138 let erase::Serializer::Map(serializer) = self else {
1139 ::core::panicking::unreachable_default_msg();unreachable!();
1140 };
1141 serializer.serialize_value(value).map_err(|err| {
1142 *self = erase::Serializer::Error(err);
1143 ShortCircuit
1144 })
1145 }
1146
1147 fn erased_serialize_entry(
1148 &mut self,
1149 key: &dyn Serialize,
1150 value: &dyn Serialize,
1151 ) -> Result<(), ErrorImpl> {
1152 let erase::Serializer::Map(serializer) = self else {
1153 ::core::panicking::unreachable_default_msg();unreachable!();
1154 };
1155 serializer.serialize_entry(key, value).map_err(|err| {
1156 *self = erase::Serializer::Error(err);
1157 ShortCircuit
1158 })
1159 }
1160
1161 fn erased_end(&mut self) {
1162 let erase::Serializer::Map(serializer) = self.take() else {
1163 ::core::panicking::unreachable_default_msg();unreachable!();
1164 };
1165 *self = match serializer.end() {
1166 Ok(ok) => erase::Serializer::Complete(ok),
1167 Err(err) => erase::Serializer::Error(err),
1168 };
1169 }
1170}
1171
1172impl serde::ser::SerializeMap for MakeSerializer<&mut dyn SerializeMap> {
1173 type Ok = ();
1174 type Error = ErrorImpl;
1175
1176 fn serialize_key<T>(&mut self, key: &T) -> Result<(), Self::Error>
1177 where
1178 T: ?Sized + serde::Serialize,
1179 {
1180 self.0.erased_serialize_key(&key)
1181 }
1182
1183 fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
1184 where
1185 T: ?Sized + serde::Serialize,
1186 {
1187 self.0.erased_serialize_value(&value)
1188 }
1189
1190 fn serialize_entry<K, V>(&mut self, key: &K, value: &V) -> Result<(), Self::Error>
1191 where
1192 K: ?Sized + serde::Serialize,
1193 V: ?Sized + serde::Serialize,
1194 {
1195 self.0.erased_serialize_entry(&key, &value)
1196 }
1197
1198 fn end(self) -> Result<Self::Ok, Self::Error> {
1199 self.0.erased_end();
1200 Ok(())
1201 }
1202}
1203
1204pub trait SerializeStruct {
1205 fn erased_serialize_field(
1206 &mut self,
1207 key: &'static str,
1208 value: &dyn Serialize,
1209 ) -> Result<(), ErrorImpl>;
1210 fn erased_skip_field(&mut self, key: &'static str) -> Result<(), ErrorImpl>;
1211 fn erased_end(&mut self);
1212}
1213
1214impl<T> SerializeStruct for erase::Serializer<T>
1215where
1216 T: serde::Serializer,
1217{
1218 fn erased_serialize_field(
1219 &mut self,
1220 key: &'static str,
1221 value: &dyn Serialize,
1222 ) -> Result<(), ErrorImpl> {
1223 let erase::Serializer::Struct(serializer) = self else {
1224 ::core::panicking::unreachable_default_msg();unreachable!();
1225 };
1226 serializer.serialize_field(key, value).map_err(|err| {
1227 *self = erase::Serializer::Error(err);
1228 ShortCircuit
1229 })
1230 }
1231
1232 fn erased_skip_field(&mut self, key: &'static str) -> Result<(), ErrorImpl> {
1233 let erase::Serializer::Struct(serializer) = self else {
1234 ::core::panicking::unreachable_default_msg();unreachable!();
1235 };
1236 serializer.skip_field(key).map_err(|err| {
1237 *self = erase::Serializer::Error(err);
1238 ShortCircuit
1239 })
1240 }
1241
1242 fn erased_end(&mut self) {
1243 let erase::Serializer::Struct(serializer) = self.take() else {
1244 ::core::panicking::unreachable_default_msg();unreachable!();
1245 };
1246 *self = match serializer.end() {
1247 Ok(ok) => erase::Serializer::Complete(ok),
1248 Err(err) => erase::Serializer::Error(err),
1249 };
1250 }
1251}
1252
1253impl serde::ser::SerializeStruct for MakeSerializer<&mut dyn SerializeStruct> {
1254 type Ok = ();
1255 type Error = ErrorImpl;
1256
1257 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
1258 where
1259 T: ?Sized + serde::Serialize,
1260 {
1261 self.0.erased_serialize_field(key, &value)
1262 }
1263
1264 fn skip_field(&mut self, key: &'static str) -> Result<(), Self::Error> {
1265 self.0.erased_skip_field(key)
1266 }
1267
1268 fn end(self) -> Result<Self::Ok, Self::Error> {
1269 self.0.erased_end();
1270 Ok(())
1271 }
1272}
1273
1274pub trait SerializeStructVariant {
1275 fn erased_serialize_field(
1276 &mut self,
1277 key: &'static str,
1278 value: &dyn Serialize,
1279 ) -> Result<(), ErrorImpl>;
1280 fn erased_skip_field(&mut self, key: &'static str) -> Result<(), ErrorImpl>;
1281 fn erased_end(&mut self);
1282}
1283
1284impl<T> SerializeStructVariant for erase::Serializer<T>
1285where
1286 T: serde::Serializer,
1287{
1288 fn erased_serialize_field(
1289 &mut self,
1290 key: &'static str,
1291 value: &dyn Serialize,
1292 ) -> Result<(), ErrorImpl> {
1293 let erase::Serializer::StructVariant(serializer) = self else {
1294 ::core::panicking::unreachable_default_msg();unreachable!();
1295 };
1296 serializer.serialize_field(key, value).map_err(|err| {
1297 *self = erase::Serializer::Error(err);
1298 ShortCircuit
1299 })
1300 }
1301
1302 fn erased_skip_field(&mut self, key: &'static str) -> Result<(), ErrorImpl> {
1303 let erase::Serializer::StructVariant(serializer) = self else {
1304 ::core::panicking::unreachable_default_msg();unreachable!();
1305 };
1306 serializer.skip_field(key).map_err(|err| {
1307 *self = erase::Serializer::Error(err);
1308 ShortCircuit
1309 })
1310 }
1311
1312 fn erased_end(&mut self) {
1313 let erase::Serializer::StructVariant(serializer) = self.take() else {
1314 ::core::panicking::unreachable_default_msg();unreachable!();
1315 };
1316 *self = match serializer.end() {
1317 Ok(ok) => erase::Serializer::Complete(ok),
1318 Err(err) => erase::Serializer::Error(err),
1319 };
1320 }
1321}
1322
1323impl serde::ser::SerializeStructVariant for MakeSerializer<&mut dyn SerializeStructVariant> {
1324 type Ok = ();
1325 type Error = ErrorImpl;
1326
1327 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
1328 where
1329 T: ?Sized + serde::Serialize,
1330 {
1331 self.0.erased_serialize_field(key, &value)
1332 }
1333
1334 fn skip_field(&mut self, key: &'static str) -> Result<(), Self::Error> {
1335 self.0.erased_skip_field(key)
1336 }
1337
1338 fn end(self) -> Result<Self::Ok, Self::Error> {
1339 self.0.erased_end();
1340 Ok(())
1341 }
1342}
1343
1344macro_rules! deref_erased_serializer {
1347 (<$T:ident> Serializer for $ty:ty $(where $($where:tt)*)?) => {
1348 impl<$T> Serializer for $ty $(where $($where)*)? {
1349 fn erased_serialize_bool(&mut self, v: bool) {
1350 (**self).erased_serialize_bool(v);
1351 }
1352
1353 fn erased_serialize_i8(&mut self, v: i8) {
1354 (**self).erased_serialize_i8(v);
1355 }
1356
1357 fn erased_serialize_i16(&mut self, v: i16) {
1358 (**self).erased_serialize_i16(v);
1359 }
1360
1361 fn erased_serialize_i32(&mut self, v: i32) {
1362 (**self).erased_serialize_i32(v);
1363 }
1364
1365 fn erased_serialize_i64(&mut self, v: i64) {
1366 (**self).erased_serialize_i64(v);
1367 }
1368
1369 fn erased_serialize_i128(&mut self, v: i128) {
1370 (**self).erased_serialize_i128(v);
1371 }
1372
1373 fn erased_serialize_u8(&mut self, v: u8) {
1374 (**self).erased_serialize_u8(v);
1375 }
1376
1377 fn erased_serialize_u16(&mut self, v: u16) {
1378 (**self).erased_serialize_u16(v);
1379 }
1380
1381 fn erased_serialize_u32(&mut self, v: u32) {
1382 (**self).erased_serialize_u32(v);
1383 }
1384
1385 fn erased_serialize_u64(&mut self, v: u64) {
1386 (**self).erased_serialize_u64(v);
1387 }
1388
1389 fn erased_serialize_u128(&mut self, v: u128) {
1390 (**self).erased_serialize_u128(v);
1391 }
1392
1393 fn erased_serialize_f32(&mut self, v: f32) {
1394 (**self).erased_serialize_f32(v);
1395 }
1396
1397 fn erased_serialize_f64(&mut self, v: f64) {
1398 (**self).erased_serialize_f64(v);
1399 }
1400
1401 fn erased_serialize_char(&mut self, v: char) {
1402 (**self).erased_serialize_char(v);
1403 }
1404
1405 fn erased_serialize_str(&mut self, v: &str) {
1406 (**self).erased_serialize_str(v);
1407 }
1408
1409 fn erased_serialize_bytes(&mut self, v: &[u8]) {
1410 (**self).erased_serialize_bytes(v);
1411 }
1412
1413 fn erased_serialize_none(&mut self) {
1414 (**self).erased_serialize_none();
1415 }
1416
1417 fn erased_serialize_some(&mut self, value: &dyn Serialize) {
1418 (**self).erased_serialize_some(value);
1419 }
1420
1421 fn erased_serialize_unit(&mut self) {
1422 (**self).erased_serialize_unit();
1423 }
1424
1425 fn erased_serialize_unit_struct(&mut self, name: &'static str) {
1426 (**self).erased_serialize_unit_struct(name);
1427 }
1428
1429 fn erased_serialize_unit_variant(&mut self, name: &'static str, variant_index: u32, variant: &'static str) {
1430 (**self).erased_serialize_unit_variant(name, variant_index, variant);
1431 }
1432
1433 fn erased_serialize_newtype_struct(&mut self, name: &'static str, value: &dyn Serialize) {
1434 (**self).erased_serialize_newtype_struct(name, value);
1435 }
1436
1437 fn erased_serialize_newtype_variant(&mut self, name: &'static str, variant_index: u32, variant: &'static str, value: &dyn Serialize) {
1438 (**self).erased_serialize_newtype_variant(name, variant_index, variant, value);
1439 }
1440
1441 fn erased_serialize_seq(&mut self, len: Option<usize>) -> Result<&mut dyn SerializeSeq, ErrorImpl> {
1442 (**self).erased_serialize_seq(len)
1443 }
1444
1445 fn erased_serialize_tuple(&mut self, len: usize) -> Result<&mut dyn SerializeTuple, ErrorImpl> {
1446 (**self).erased_serialize_tuple(len)
1447 }
1448
1449 fn erased_serialize_tuple_struct(&mut self, name: &'static str, len: usize) -> Result<&mut dyn SerializeTupleStruct, ErrorImpl> {
1450 (**self).erased_serialize_tuple_struct(name, len)
1451 }
1452
1453 fn erased_serialize_tuple_variant(&mut self, name: &'static str, variant_index: u32, variant: &'static str, len: usize) -> Result<&mut dyn SerializeTupleVariant, ErrorImpl> {
1454 (**self).erased_serialize_tuple_variant(name, variant_index, variant, len)
1455 }
1456
1457 fn erased_serialize_map(&mut self, len: Option<usize>) -> Result<&mut dyn SerializeMap, ErrorImpl> {
1458 (**self).erased_serialize_map(len)
1459 }
1460
1461 fn erased_serialize_struct(&mut self, name: &'static str, len: usize) -> Result<&mut dyn SerializeStruct, ErrorImpl> {
1462 (**self).erased_serialize_struct(name, len)
1463 }
1464
1465 fn erased_serialize_struct_variant(&mut self, name: &'static str, variant_index: u32, variant: &'static str, len: usize) -> Result<&mut dyn SerializeStructVariant, ErrorImpl> {
1466 (**self).erased_serialize_struct_variant(name, variant_index, variant, len)
1467 }
1468
1469 fn erased_collect_str(&mut self, value: &dyn Display) {
1470 (**self).erased_collect_str(value);
1471 }
1472
1473 fn erased_is_human_readable(&self) -> bool {
1474 (**self).erased_is_human_readable()
1475 }
1476
1477 fn erased_display_error(&self) -> &dyn Display {
1478 (**self).erased_display_error()
1479 }
1480 }
1481
1482 impl<$T> sealed::serializer::Sealed for $ty $(where $($where)*)? {}
1483 };
1484}
1485
1486impl<T> Serializer for &mut T where T: ?Sized + Serializer {
fn erased_serialize_bool(&mut self, v: bool) {
(**self).erased_serialize_bool(v);
}
fn erased_serialize_i8(&mut self, v: i8) {
(**self).erased_serialize_i8(v);
}
fn erased_serialize_i16(&mut self, v: i16) {
(**self).erased_serialize_i16(v);
}
fn erased_serialize_i32(&mut self, v: i32) {
(**self).erased_serialize_i32(v);
}
fn erased_serialize_i64(&mut self, v: i64) {
(**self).erased_serialize_i64(v);
}
fn erased_serialize_i128(&mut self, v: i128) {
(**self).erased_serialize_i128(v);
}
fn erased_serialize_u8(&mut self, v: u8) {
(**self).erased_serialize_u8(v);
}
fn erased_serialize_u16(&mut self, v: u16) {
(**self).erased_serialize_u16(v);
}
fn erased_serialize_u32(&mut self, v: u32) {
(**self).erased_serialize_u32(v);
}
fn erased_serialize_u64(&mut self, v: u64) {
(**self).erased_serialize_u64(v);
}
fn erased_serialize_u128(&mut self, v: u128) {
(**self).erased_serialize_u128(v);
}
fn erased_serialize_f32(&mut self, v: f32) {
(**self).erased_serialize_f32(v);
}
fn erased_serialize_f64(&mut self, v: f64) {
(**self).erased_serialize_f64(v);
}
fn erased_serialize_char(&mut self, v: char) {
(**self).erased_serialize_char(v);
}
fn erased_serialize_str(&mut self, v: &str) {
(**self).erased_serialize_str(v);
}
fn erased_serialize_bytes(&mut self, v: &[u8]) {
(**self).erased_serialize_bytes(v);
}
fn erased_serialize_none(&mut self) { (**self).erased_serialize_none(); }
fn erased_serialize_some(&mut self, value: &dyn Serialize) {
(**self).erased_serialize_some(value);
}
fn erased_serialize_unit(&mut self) { (**self).erased_serialize_unit(); }
fn erased_serialize_unit_struct(&mut self, name: &'static str) {
(**self).erased_serialize_unit_struct(name);
}
fn erased_serialize_unit_variant(&mut self, name: &'static str,
variant_index: u32, variant: &'static str) {
(**self).erased_serialize_unit_variant(name, variant_index, variant);
}
fn erased_serialize_newtype_struct(&mut self, name: &'static str,
value: &dyn Serialize) {
(**self).erased_serialize_newtype_struct(name, value);
}
fn erased_serialize_newtype_variant(&mut self, name: &'static str,
variant_index: u32, variant: &'static str, value: &dyn Serialize) {
(**self).erased_serialize_newtype_variant(name, variant_index,
variant, value);
}
fn erased_serialize_seq(&mut self, len: Option<usize>)
-> Result<&mut dyn SerializeSeq, ErrorImpl> {
(**self).erased_serialize_seq(len)
}
fn erased_serialize_tuple(&mut self, len: usize)
-> Result<&mut dyn SerializeTuple, ErrorImpl> {
(**self).erased_serialize_tuple(len)
}
fn erased_serialize_tuple_struct(&mut self, name: &'static str,
len: usize) -> Result<&mut dyn SerializeTupleStruct, ErrorImpl> {
(**self).erased_serialize_tuple_struct(name, len)
}
fn erased_serialize_tuple_variant(&mut self, name: &'static str,
variant_index: u32, variant: &'static str, len: usize)
-> Result<&mut dyn SerializeTupleVariant, ErrorImpl> {
(**self).erased_serialize_tuple_variant(name, variant_index, variant,
len)
}
fn erased_serialize_map(&mut self, len: Option<usize>)
-> Result<&mut dyn SerializeMap, ErrorImpl> {
(**self).erased_serialize_map(len)
}
fn erased_serialize_struct(&mut self, name: &'static str, len: usize)
-> Result<&mut dyn SerializeStruct, ErrorImpl> {
(**self).erased_serialize_struct(name, len)
}
fn erased_serialize_struct_variant(&mut self, name: &'static str,
variant_index: u32, variant: &'static str, len: usize)
-> Result<&mut dyn SerializeStructVariant, ErrorImpl> {
(**self).erased_serialize_struct_variant(name, variant_index, variant,
len)
}
fn erased_collect_str(&mut self, value: &dyn Display) {
(**self).erased_collect_str(value);
}
fn erased_is_human_readable(&self) -> bool {
(**self).erased_is_human_readable()
}
fn erased_display_error(&self) -> &dyn Display {
(**self).erased_display_error()
}
}
impl<T> sealed::serializer::Sealed for &mut T where T: ?Sized + Serializer {}deref_erased_serializer!(<T> Serializer for &mut T where T: ?Sized + Serializer);
1487impl<T> Serializer for Box<T> where T: ?Sized + Serializer {
fn erased_serialize_bool(&mut self, v: bool) {
(**self).erased_serialize_bool(v);
}
fn erased_serialize_i8(&mut self, v: i8) {
(**self).erased_serialize_i8(v);
}
fn erased_serialize_i16(&mut self, v: i16) {
(**self).erased_serialize_i16(v);
}
fn erased_serialize_i32(&mut self, v: i32) {
(**self).erased_serialize_i32(v);
}
fn erased_serialize_i64(&mut self, v: i64) {
(**self).erased_serialize_i64(v);
}
fn erased_serialize_i128(&mut self, v: i128) {
(**self).erased_serialize_i128(v);
}
fn erased_serialize_u8(&mut self, v: u8) {
(**self).erased_serialize_u8(v);
}
fn erased_serialize_u16(&mut self, v: u16) {
(**self).erased_serialize_u16(v);
}
fn erased_serialize_u32(&mut self, v: u32) {
(**self).erased_serialize_u32(v);
}
fn erased_serialize_u64(&mut self, v: u64) {
(**self).erased_serialize_u64(v);
}
fn erased_serialize_u128(&mut self, v: u128) {
(**self).erased_serialize_u128(v);
}
fn erased_serialize_f32(&mut self, v: f32) {
(**self).erased_serialize_f32(v);
}
fn erased_serialize_f64(&mut self, v: f64) {
(**self).erased_serialize_f64(v);
}
fn erased_serialize_char(&mut self, v: char) {
(**self).erased_serialize_char(v);
}
fn erased_serialize_str(&mut self, v: &str) {
(**self).erased_serialize_str(v);
}
fn erased_serialize_bytes(&mut self, v: &[u8]) {
(**self).erased_serialize_bytes(v);
}
fn erased_serialize_none(&mut self) { (**self).erased_serialize_none(); }
fn erased_serialize_some(&mut self, value: &dyn Serialize) {
(**self).erased_serialize_some(value);
}
fn erased_serialize_unit(&mut self) { (**self).erased_serialize_unit(); }
fn erased_serialize_unit_struct(&mut self, name: &'static str) {
(**self).erased_serialize_unit_struct(name);
}
fn erased_serialize_unit_variant(&mut self, name: &'static str,
variant_index: u32, variant: &'static str) {
(**self).erased_serialize_unit_variant(name, variant_index, variant);
}
fn erased_serialize_newtype_struct(&mut self, name: &'static str,
value: &dyn Serialize) {
(**self).erased_serialize_newtype_struct(name, value);
}
fn erased_serialize_newtype_variant(&mut self, name: &'static str,
variant_index: u32, variant: &'static str, value: &dyn Serialize) {
(**self).erased_serialize_newtype_variant(name, variant_index,
variant, value);
}
fn erased_serialize_seq(&mut self, len: Option<usize>)
-> Result<&mut dyn SerializeSeq, ErrorImpl> {
(**self).erased_serialize_seq(len)
}
fn erased_serialize_tuple(&mut self, len: usize)
-> Result<&mut dyn SerializeTuple, ErrorImpl> {
(**self).erased_serialize_tuple(len)
}
fn erased_serialize_tuple_struct(&mut self, name: &'static str,
len: usize) -> Result<&mut dyn SerializeTupleStruct, ErrorImpl> {
(**self).erased_serialize_tuple_struct(name, len)
}
fn erased_serialize_tuple_variant(&mut self, name: &'static str,
variant_index: u32, variant: &'static str, len: usize)
-> Result<&mut dyn SerializeTupleVariant, ErrorImpl> {
(**self).erased_serialize_tuple_variant(name, variant_index, variant,
len)
}
fn erased_serialize_map(&mut self, len: Option<usize>)
-> Result<&mut dyn SerializeMap, ErrorImpl> {
(**self).erased_serialize_map(len)
}
fn erased_serialize_struct(&mut self, name: &'static str, len: usize)
-> Result<&mut dyn SerializeStruct, ErrorImpl> {
(**self).erased_serialize_struct(name, len)
}
fn erased_serialize_struct_variant(&mut self, name: &'static str,
variant_index: u32, variant: &'static str, len: usize)
-> Result<&mut dyn SerializeStructVariant, ErrorImpl> {
(**self).erased_serialize_struct_variant(name, variant_index, variant,
len)
}
fn erased_collect_str(&mut self, value: &dyn Display) {
(**self).erased_collect_str(value);
}
fn erased_is_human_readable(&self) -> bool {
(**self).erased_is_human_readable()
}
fn erased_display_error(&self) -> &dyn Display {
(**self).erased_display_error()
}
}
impl<T> sealed::serializer::Sealed for Box<T> where T: ?Sized + Serializer {}deref_erased_serializer!(<T> Serializer for Box<T> where T: ?Sized + Serializer);
1488
1489#[cfg(test)]
1492mod tests {
1493 use super::*;
1494 use alloc::{vec, vec::Vec};
1495 use serde_derive::Serialize;
1496
1497 fn test_json<T>(t: T)
1498 where
1499 T: serde::Serialize,
1500 {
1501 let expected = serde_json::to_vec(&t).unwrap();
1502
1503 {
1505 let obj: &dyn Serialize = &t;
1506
1507 let mut buf = Vec::new();
1508
1509 {
1510 let mut ser = serde_json::Serializer::new(&mut buf);
1511 let ser: &mut dyn Serializer = &mut <dyn Serializer>::erase(&mut ser);
1512
1513 obj.erased_serialize(ser).unwrap();
1514 }
1515
1516 assert_eq!(buf, expected);
1517 }
1518
1519 {
1521 let obj: Box<dyn Serialize> = Box::new(t);
1522
1523 let mut buf = Vec::new();
1524
1525 {
1526 let mut ser = serde_json::Serializer::new(&mut buf);
1527 let mut ser: Box<dyn Serializer> = Box::new(<dyn Serializer>::erase(&mut ser));
1528
1529 obj.erased_serialize(&mut ser).unwrap();
1530 }
1531
1532 assert_eq!(buf, expected);
1533 }
1534 }
1535
1536 #[test]
1537 fn test_vec() {
1538 test_json(vec!["a", "b"]);
1539 }
1540
1541 #[test]
1542 fn test_struct() {
1543 #[derive(Serialize)]
1544 struct S {
1545 f: usize,
1546 }
1547
1548 test_json(S { f: 256 });
1549 }
1550
1551 #[test]
1552 fn test_enum() {
1553 #[derive(Serialize)]
1554 enum E {
1555 Unit,
1556 Newtype(bool),
1557 Tuple(bool, bool),
1558 Struct { t: bool, f: bool },
1559 }
1560
1561 test_json(E::Unit);
1562 test_json(E::Newtype(true));
1563 test_json(E::Tuple(true, false));
1564 test_json(E::Struct { t: true, f: false });
1565 }
1566
1567 #[test]
1568 fn test_error_custom() {
1569 struct Kaboom;
1570
1571 impl serde::Serialize for Kaboom {
1572 fn serialize<S>(&self, _: S) -> Result<S::Ok, S::Error>
1573 where
1574 S: serde::Serializer,
1575 {
1576 use serde::ser::Error as _;
1577
1578 Err(S::Error::custom("kaboom"))
1579 }
1580 }
1581
1582 let obj: &dyn Serialize = &Kaboom;
1583
1584 let err = serde_json::to_vec(obj).unwrap_err();
1585 assert_eq!(err.to_string(), "kaboom");
1586 }
1587
1588 #[test]
1589 fn assert_serialize() {
1590 fn assert<T: serde::Serialize>() {}
1591
1592 assert::<&dyn Serialize>();
1593 assert::<&(dyn Serialize + Send)>();
1594 assert::<&(dyn Serialize + Sync)>();
1595 assert::<&(dyn Serialize + Send + Sync)>();
1596 assert::<&(dyn Serialize + Sync + Send)>();
1597 assert::<Vec<&dyn Serialize>>();
1598 assert::<Vec<&(dyn Serialize + Send)>>();
1599
1600 assert::<Box<dyn Serialize>>();
1601 assert::<Box<dyn Serialize + Send>>();
1602 assert::<Box<dyn Serialize + Sync>>();
1603 assert::<Box<dyn Serialize + Send + Sync>>();
1604 assert::<Box<dyn Serialize + Sync + Send>>();
1605 assert::<Vec<Box<dyn Serialize>>>();
1606 assert::<Vec<Box<dyn Serialize + Send>>>();
1607 }
1608
1609 #[test]
1610 fn test_dangle() {
1611 let mut json_serializer = serde_json::Serializer::new(Vec::new());
1612 let _erased_serializer = <dyn Serializer>::erase(&mut json_serializer);
1613 drop(json_serializer);
1614 }
1615}