Skip to main content

erased_serde/
ser.rs

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// TRAITS //////////////////////////////////////////////////////////////////////
13
14/// An object-safe equivalent of Serde's `Serialize` trait.
15///
16/// Any implementation of Serde's `Serialize` converts seamlessly to a
17/// `&dyn erased_serde::Serialize` or `Box<dyn erased_serde::Serialize>` trait
18/// object.
19///
20/// ```rust
21/// use erased_serde::{Serialize, Serializer};
22/// use std::collections::BTreeMap as Map;
23/// use std::io;
24///
25/// fn main() {
26///     // Construct some serializers.
27///     let json = &mut serde_json::Serializer::new(io::stdout());
28///     let cbor = &mut serde_cbor::Serializer::new(serde_cbor::ser::IoWrite::new(io::stdout()));
29///
30///     // The values in this map are boxed trait objects. Ordinarily this would not
31///     // be possible with serde::Serializer because of object safety, but type
32///     // erasure makes it possible with erased_serde::Serializer.
33///     let mut formats: Map<&str, Box<dyn Serializer>> = Map::new();
34///     formats.insert("json", Box::new(<dyn Serializer>::erase(json)));
35///     formats.insert("cbor", Box::new(<dyn Serializer>::erase(cbor)));
36///
37///     // These are boxed trait objects as well. Same thing here - type erasure
38///     // makes this possible.
39///     let mut values: Map<&str, Box<dyn Serialize>> = Map::new();
40///     values.insert("vec", Box::new(vec!["a", "b"]));
41///     values.insert("int", Box::new(65536));
42///
43///     // Pick a Serializer out of the formats map.
44///     let format = formats.get_mut("json").unwrap();
45///
46///     // Pick a Serialize out of the values map.
47///     let value = values.get("vec").unwrap();
48///
49///     // This line prints `["a","b"]` to stdout.
50///     value.erased_serialize(format).unwrap();
51/// }
52/// ```
53///
54/// This trait is sealed and can only be implemented via a `serde::Serialize`
55/// impl.
56#[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
70/// An object-safe equivalent of Serde's `Serializer` trait.
71///
72/// Any implementation of Serde's `Serializer` can be converted to a
73/// `&dyn erased_serde::Serializer` or `Box<dyn erased_serde::Serializer>` trait
74/// object using `erased_serde::Serializer::erase`.
75///
76/// ```rust
77/// use erased_serde::{Serialize, Serializer};
78/// use std::collections::BTreeMap as Map;
79/// use std::io;
80///
81/// fn main() {
82///     // Construct some serializers.
83///     let json = &mut serde_json::Serializer::new(io::stdout());
84///     let cbor = &mut serde_cbor::Serializer::new(serde_cbor::ser::IoWrite::new(io::stdout()));
85///
86///     // The values in this map are boxed trait objects. Ordinarily this would not
87///     // be possible with serde::Serializer because of object safety, but type
88///     // erasure makes it possible with erased_serde::Serializer.
89///     let mut formats: Map<&str, Box<dyn Serializer>> = Map::new();
90///     formats.insert("json", Box::new(<dyn Serializer>::erase(json)));
91///     formats.insert("cbor", Box::new(<dyn Serializer>::erase(cbor)));
92///
93///     // These are boxed trait objects as well. Same thing here - type erasure
94///     // makes this possible.
95///     let mut values: Map<&str, Box<dyn Serialize>> = Map::new();
96///     values.insert("vec", Box::new(vec!["a", "b"]));
97///     values.insert("int", Box::new(65536));
98///
99///     // Pick a Serializer out of the formats map.
100///     let format = formats.get_mut("json").unwrap();
101///
102///     // Pick a Serialize out of the values map.
103///     let value = values.get("vec").unwrap();
104///
105///     // This line prints `["a","b"]` to stdout.
106///     value.erased_serialize(format).unwrap();
107/// }
108/// ```
109///
110/// This trait is sealed and can only be implemented via a `serde::Serializer`
111/// impl.
112pub 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        /// Convert any Serde `Serializer` to a trait object.
189        ///
190        /// ```rust
191        /// use erased_serde::{Serialize, Serializer};
192        /// use std::collections::BTreeMap as Map;
193        /// use std::io;
194        ///
195        /// fn main() {
196        ///     // Construct some serializers.
197        ///     let json = &mut serde_json::Serializer::new(io::stdout());
198        ///     let cbor = &mut serde_cbor::Serializer::new(serde_cbor::ser::IoWrite::new(io::stdout()));
199        ///
200        ///     // The values in this map are boxed trait objects. Ordinarily this would not
201        ///     // be possible with serde::Serializer because of object safety, but type
202        ///     // erasure makes it possible with erased_serde::Serializer.
203        ///     let mut formats: Map<&str, Box<dyn Serializer>> = Map::new();
204        ///     formats.insert("json", Box::new(<dyn Serializer>::erase(json)));
205        ///     formats.insert("cbor", Box::new(<dyn Serializer>::erase(cbor)));
206        ///
207        ///     // These are boxed trait objects as well. Same thing here - type erasure
208        ///     // makes this possible.
209        ///     let mut values: Map<&str, Box<dyn Serialize>> = Map::new();
210        ///     values.insert("vec", Box::new(vec!["a", "b"]));
211        ///     values.insert("int", Box::new(65536));
212        ///
213        ///     // Pick a Serializer out of the formats map.
214        ///     let format = formats.get_mut("json").unwrap();
215        ///
216        ///     // Pick a Serialize out of the values map.
217        ///     let value = values.get("vec").unwrap();
218        ///
219        ///     // This line prints `["a","b"]` to stdout.
220        ///     value.erased_serialize(format).unwrap();
221        /// }
222        /// ```
223        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
232// IMPL ERASED SERDE FOR SERDE /////////////////////////////////////////////////
233
234impl<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
650// IMPL SERDE FOR ERASED SERDE /////////////////////////////////////////////////
651
652/// Serialize the given type-erased serializable value.
653///
654/// This can be used to implement `serde::Serialize` for trait objects that have
655/// `erased_serde::Serialize` as a supertrait.
656///
657/// ```
658/// trait Event: erased_serde::Serialize {
659///     /* ... */
660/// }
661///
662/// impl<'a> serde::Serialize for dyn Event + 'a {
663///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
664///     where
665///         S: serde::Serializer,
666///     {
667///         erased_serde::serialize(self, serializer)
668///     }
669/// }
670/// ```
671///
672/// Since this is reasonably common, the `serialize_trait_object!` macro
673/// generates such a Serialize impl.
674///
675/// ```
676/// use erased_serde::serialize_trait_object;
677/// #
678/// # trait Event: erased_serde::Serialize {}
679///
680/// serialize_trait_object!(Event);
681/// ```
682pub 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
1344// IMPL ERASED SERDE FOR ERASED SERDE //////////////////////////////////////////
1345
1346macro_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// TEST ////////////////////////////////////////////////////////////////////////
1490
1491#[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        // test borrowed trait object
1504        {
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        // test boxed trait object
1520        {
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}