summaryrefslogtreecommitdiffstats
path: root/vendor/erased-serde/src/ser.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/erased-serde/src/ser.rs')
-rw-r--r--vendor/erased-serde/src/ser.rs1495
1 files changed, 1495 insertions, 0 deletions
diff --git a/vendor/erased-serde/src/ser.rs b/vendor/erased-serde/src/ser.rs
new file mode 100644
index 000000000..10c486bcb
--- /dev/null
+++ b/vendor/erased-serde/src/ser.rs
@@ -0,0 +1,1495 @@
+use crate::alloc::Box;
+use crate::any::Any;
+use crate::error::Error;
+use crate::map::ResultExt;
+use core::fmt::Display;
+use core::marker::PhantomData;
+use serde::ser::{
+ SerializeMap, SerializeSeq, SerializeStruct, SerializeStructVariant, SerializeTuple,
+ SerializeTupleStruct, SerializeTupleVariant,
+};
+
+// TRAITS //////////////////////////////////////////////////////////////////////
+
+/// An object-safe equivalent of Serde's `Serialize` trait.
+///
+/// Any implementation of Serde's `Serialize` converts seamlessly to an
+/// `&erased_serde::Serialize` or `Box<erased_serde::Serialize>` trait object.
+///
+/// ```rust
+/// use erased_serde::{Serialize, Serializer};
+/// use std::collections::BTreeMap as Map;
+/// use std::io;
+///
+/// fn main() {
+/// // Construct some serializers.
+/// let json = &mut serde_json::Serializer::new(io::stdout());
+/// let cbor = &mut serde_cbor::Serializer::new(serde_cbor::ser::IoWrite::new(io::stdout()));
+///
+/// // The values in this map are boxed trait objects. Ordinarily this would not
+/// // be possible with serde::Serializer because of object safety, but type
+/// // erasure makes it possible with erased_serde::Serializer.
+/// let mut formats: Map<&str, Box<dyn Serializer>> = Map::new();
+/// formats.insert("json", Box::new(<dyn Serializer>::erase(json)));
+/// formats.insert("cbor", Box::new(<dyn Serializer>::erase(cbor)));
+///
+/// // These are boxed trait objects as well. Same thing here - type erasure
+/// // makes this possible.
+/// let mut values: Map<&str, Box<dyn Serialize>> = Map::new();
+/// values.insert("vec", Box::new(vec!["a", "b"]));
+/// values.insert("int", Box::new(65536));
+///
+/// // Pick a Serializer out of the formats map.
+/// let format = formats.get_mut("json").unwrap();
+///
+/// // Pick a Serialize out of the values map.
+/// let value = values.get("vec").unwrap();
+///
+/// // This line prints `["a","b"]` to stdout.
+/// value.erased_serialize(format).unwrap();
+/// }
+/// ```
+pub trait Serialize {
+ fn erased_serialize(&self, v: &mut dyn Serializer) -> Result<Ok, Error>;
+}
+
+/// An object-safe equivalent of Serde's `Serializer` trait.
+///
+/// Any implementation of Serde's `Serializer` can be converted to an
+/// `&erased_serde::Serializer` or `Box<erased_serde::Serializer>` trait object
+/// using `erased_serde::Serializer::erase`.
+///
+/// ```rust
+/// use erased_serde::{Serialize, Serializer};
+/// use std::collections::BTreeMap as Map;
+/// use std::io;
+///
+/// fn main() {
+/// // Construct some serializers.
+/// let json = &mut serde_json::Serializer::new(io::stdout());
+/// let cbor = &mut serde_cbor::Serializer::new(serde_cbor::ser::IoWrite::new(io::stdout()));
+///
+/// // The values in this map are boxed trait objects. Ordinarily this would not
+/// // be possible with serde::Serializer because of object safety, but type
+/// // erasure makes it possible with erased_serde::Serializer.
+/// let mut formats: Map<&str, Box<dyn Serializer>> = Map::new();
+/// formats.insert("json", Box::new(<dyn Serializer>::erase(json)));
+/// formats.insert("cbor", Box::new(<dyn Serializer>::erase(cbor)));
+///
+/// // These are boxed trait objects as well. Same thing here - type erasure
+/// // makes this possible.
+/// let mut values: Map<&str, Box<dyn Serialize>> = Map::new();
+/// values.insert("vec", Box::new(vec!["a", "b"]));
+/// values.insert("int", Box::new(65536));
+///
+/// // Pick a Serializer out of the formats map.
+/// let format = formats.get_mut("json").unwrap();
+///
+/// // Pick a Serialize out of the values map.
+/// let value = values.get("vec").unwrap();
+///
+/// // This line prints `["a","b"]` to stdout.
+/// value.erased_serialize(format).unwrap();
+/// }
+/// ```
+pub trait Serializer {
+ fn erased_serialize_bool(&mut self, v: bool) -> Result<Ok, Error>;
+ fn erased_serialize_i8(&mut self, v: i8) -> Result<Ok, Error>;
+ fn erased_serialize_i16(&mut self, v: i16) -> Result<Ok, Error>;
+ fn erased_serialize_i32(&mut self, v: i32) -> Result<Ok, Error>;
+ fn erased_serialize_i64(&mut self, v: i64) -> Result<Ok, Error>;
+ fn erased_serialize_i128(&mut self, v: i128) -> Result<Ok, Error>;
+ fn erased_serialize_u8(&mut self, v: u8) -> Result<Ok, Error>;
+ fn erased_serialize_u16(&mut self, v: u16) -> Result<Ok, Error>;
+ fn erased_serialize_u32(&mut self, v: u32) -> Result<Ok, Error>;
+ fn erased_serialize_u64(&mut self, v: u64) -> Result<Ok, Error>;
+ fn erased_serialize_u128(&mut self, v: u128) -> Result<Ok, Error>;
+ fn erased_serialize_f32(&mut self, v: f32) -> Result<Ok, Error>;
+ fn erased_serialize_f64(&mut self, v: f64) -> Result<Ok, Error>;
+ fn erased_serialize_char(&mut self, v: char) -> Result<Ok, Error>;
+ fn erased_serialize_str(&mut self, v: &str) -> Result<Ok, Error>;
+ fn erased_serialize_bytes(&mut self, v: &[u8]) -> Result<Ok, Error>;
+ fn erased_serialize_none(&mut self) -> Result<Ok, Error>;
+ fn erased_serialize_some(&mut self, v: &dyn Serialize) -> Result<Ok, Error>;
+ fn erased_serialize_unit(&mut self) -> Result<Ok, Error>;
+ fn erased_serialize_unit_struct(&mut self, name: &'static str) -> Result<Ok, Error>;
+ fn erased_serialize_unit_variant(
+ &mut self,
+ name: &'static str,
+ variant_index: u32,
+ variant: &'static str,
+ ) -> Result<Ok, Error>;
+ fn erased_serialize_newtype_struct(
+ &mut self,
+ name: &'static str,
+ v: &dyn Serialize,
+ ) -> Result<Ok, Error>;
+ fn erased_serialize_newtype_variant(
+ &mut self,
+ name: &'static str,
+ variant_index: u32,
+ variant: &'static str,
+ v: &dyn Serialize,
+ ) -> Result<Ok, Error>;
+ fn erased_serialize_seq(&mut self, len: Option<usize>) -> Result<Seq, Error>;
+ fn erased_serialize_tuple(&mut self, len: usize) -> Result<Tuple, Error>;
+ fn erased_serialize_tuple_struct(
+ &mut self,
+ name: &'static str,
+ len: usize,
+ ) -> Result<TupleStruct, Error>;
+ fn erased_serialize_tuple_variant(
+ &mut self,
+ name: &'static str,
+ variant_index: u32,
+ variant: &'static str,
+ len: usize,
+ ) -> Result<TupleVariant, Error>;
+ fn erased_serialize_map(&mut self, len: Option<usize>) -> Result<Map, Error>;
+ fn erased_serialize_struct(&mut self, name: &'static str, len: usize) -> Result<Struct, Error>;
+ fn erased_serialize_struct_variant(
+ &mut self,
+ name: &'static str,
+ variant_index: u32,
+ variant: &'static str,
+ len: usize,
+ ) -> Result<StructVariant, Error>;
+ fn erased_is_human_readable(&self) -> bool;
+}
+
+impl dyn Serializer {
+ /// Convert any Serde `Serializer` to a trait object.
+ ///
+ /// ```rust
+ /// use erased_serde::{Serialize, Serializer};
+ /// use std::collections::BTreeMap as Map;
+ /// use std::io;
+ ///
+ /// fn main() {
+ /// // Construct some serializers.
+ /// let json = &mut serde_json::Serializer::new(io::stdout());
+ /// let cbor = &mut serde_cbor::Serializer::new(serde_cbor::ser::IoWrite::new(io::stdout()));
+ ///
+ /// // The values in this map are boxed trait objects. Ordinarily this would not
+ /// // be possible with serde::Serializer because of object safety, but type
+ /// // erasure makes it possible with erased_serde::Serializer.
+ /// let mut formats: Map<&str, Box<dyn Serializer>> = Map::new();
+ /// formats.insert("json", Box::new(<dyn Serializer>::erase(json)));
+ /// formats.insert("cbor", Box::new(<dyn Serializer>::erase(cbor)));
+ ///
+ /// // These are boxed trait objects as well. Same thing here - type erasure
+ /// // makes this possible.
+ /// let mut values: Map<&str, Box<dyn Serialize>> = Map::new();
+ /// values.insert("vec", Box::new(vec!["a", "b"]));
+ /// values.insert("int", Box::new(65536));
+ ///
+ /// // Pick a Serializer out of the formats map.
+ /// let format = formats.get_mut("json").unwrap();
+ ///
+ /// // Pick a Serialize out of the values map.
+ /// let value = values.get("vec").unwrap();
+ ///
+ /// // This line prints `["a","b"]` to stdout.
+ /// value.erased_serialize(format).unwrap();
+ /// }
+ /// ```
+ pub fn erase<S>(serializer: S) -> erase::Serializer<S>
+ where
+ S: serde::Serializer,
+ S::Ok: 'static,
+ {
+ erase::Serializer {
+ state: Some(serializer),
+ }
+ }
+}
+
+// OK //////////////////////////////////////////////////////////////////////////
+
+// Corresponds to the Serializer::Ok associated type.
+//
+// This struct is exposed to users by invoking methods on the Serialize or
+// Serializer trait objects, so we need to make sure they do not hold on to the
+// Ok beyond the lifetime of the data in the Any.
+//
+// We do this by enforcing S::Ok is 'static for every Serializer trait object
+// created by the user.
+pub struct Ok {
+ data: Any,
+}
+
+impl Ok {
+ unsafe fn new<T>(t: T) -> Self {
+ Ok {
+ data: unsafe { Any::new(t) },
+ }
+ }
+
+ unsafe fn take<T>(self) -> T {
+ unsafe { self.data.take() }
+ }
+}
+
+// IMPL ERASED SERDE FOR SERDE /////////////////////////////////////////////////
+
+impl<T> Serialize for T
+where
+ T: ?Sized + serde::Serialize,
+{
+ fn erased_serialize(&self, serializer: &mut dyn Serializer) -> Result<Ok, Error> {
+ self.serialize(serializer)
+ }
+}
+
+mod erase {
+ pub struct Serializer<S> {
+ pub(crate) state: Option<S>,
+ }
+
+ impl<S> Serializer<S> {
+ pub(crate) fn take(&mut self) -> S {
+ self.state.take().unwrap()
+ }
+
+ pub(crate) fn as_ref(&self) -> &S {
+ self.state.as_ref().unwrap()
+ }
+ }
+}
+
+impl<T> Serializer for erase::Serializer<T>
+where
+ T: serde::Serializer,
+{
+ fn erased_serialize_bool(&mut self, v: bool) -> Result<Ok, Error> {
+ unsafe {
+ self.take()
+ .serialize_bool(v)
+ .unsafe_map(Ok::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_i8(&mut self, v: i8) -> Result<Ok, Error> {
+ unsafe {
+ self.take()
+ .serialize_i8(v)
+ .unsafe_map(Ok::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_i16(&mut self, v: i16) -> Result<Ok, Error> {
+ unsafe {
+ self.take()
+ .serialize_i16(v)
+ .unsafe_map(Ok::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_i32(&mut self, v: i32) -> Result<Ok, Error> {
+ unsafe {
+ self.take()
+ .serialize_i32(v)
+ .unsafe_map(Ok::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_i64(&mut self, v: i64) -> Result<Ok, Error> {
+ unsafe {
+ self.take()
+ .serialize_i64(v)
+ .unsafe_map(Ok::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_i128(&mut self, v: i128) -> Result<Ok, Error> {
+ unsafe {
+ self.take()
+ .serialize_i128(v)
+ .unsafe_map(Ok::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_u8(&mut self, v: u8) -> Result<Ok, Error> {
+ unsafe {
+ self.take()
+ .serialize_u8(v)
+ .unsafe_map(Ok::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_u16(&mut self, v: u16) -> Result<Ok, Error> {
+ unsafe {
+ self.take()
+ .serialize_u16(v)
+ .unsafe_map(Ok::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_u32(&mut self, v: u32) -> Result<Ok, Error> {
+ unsafe {
+ self.take()
+ .serialize_u32(v)
+ .unsafe_map(Ok::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_u64(&mut self, v: u64) -> Result<Ok, Error> {
+ unsafe {
+ self.take()
+ .serialize_u64(v)
+ .unsafe_map(Ok::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_u128(&mut self, v: u128) -> Result<Ok, Error> {
+ unsafe {
+ self.take()
+ .serialize_u128(v)
+ .unsafe_map(Ok::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_f32(&mut self, v: f32) -> Result<Ok, Error> {
+ unsafe {
+ self.take()
+ .serialize_f32(v)
+ .unsafe_map(Ok::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_f64(&mut self, v: f64) -> Result<Ok, Error> {
+ unsafe {
+ self.take()
+ .serialize_f64(v)
+ .unsafe_map(Ok::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_char(&mut self, v: char) -> Result<Ok, Error> {
+ unsafe {
+ self.take()
+ .serialize_char(v)
+ .unsafe_map(Ok::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_str(&mut self, v: &str) -> Result<Ok, Error> {
+ unsafe {
+ self.take()
+ .serialize_str(v)
+ .unsafe_map(Ok::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_bytes(&mut self, v: &[u8]) -> Result<Ok, Error> {
+ unsafe {
+ self.take()
+ .serialize_bytes(v)
+ .unsafe_map(Ok::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_none(&mut self) -> Result<Ok, Error> {
+ unsafe {
+ self.take()
+ .serialize_none()
+ .unsafe_map(Ok::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_some(&mut self, v: &dyn Serialize) -> Result<Ok, Error> {
+ unsafe {
+ self.take()
+ .serialize_some(v)
+ .unsafe_map(Ok::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_unit(&mut self) -> Result<Ok, Error> {
+ unsafe {
+ self.take()
+ .serialize_unit()
+ .unsafe_map(Ok::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_unit_struct(&mut self, name: &'static str) -> Result<Ok, Error> {
+ unsafe {
+ self.take()
+ .serialize_unit_struct(name)
+ .unsafe_map(Ok::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_unit_variant(
+ &mut self,
+ name: &'static str,
+ variant_index: u32,
+ variant: &'static str,
+ ) -> Result<Ok, Error> {
+ unsafe {
+ self.take()
+ .serialize_unit_variant(name, variant_index, variant)
+ .unsafe_map(Ok::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_newtype_struct(
+ &mut self,
+ name: &'static str,
+ v: &dyn Serialize,
+ ) -> Result<Ok, Error> {
+ unsafe {
+ self.take()
+ .serialize_newtype_struct(name, v)
+ .unsafe_map(Ok::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_newtype_variant(
+ &mut self,
+ name: &'static str,
+ variant_index: u32,
+ variant: &'static str,
+ v: &dyn Serialize,
+ ) -> Result<Ok, Error> {
+ unsafe {
+ self.take()
+ .serialize_newtype_variant(name, variant_index, variant, v)
+ .unsafe_map(Ok::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_seq(&mut self, len: Option<usize>) -> Result<Seq, Error> {
+ unsafe {
+ self.take()
+ .serialize_seq(len)
+ .unsafe_map(Seq::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_tuple(&mut self, len: usize) -> Result<Tuple, Error> {
+ unsafe {
+ self.take()
+ .serialize_tuple(len)
+ .unsafe_map(Tuple::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_tuple_struct(
+ &mut self,
+ name: &'static str,
+ len: usize,
+ ) -> Result<TupleStruct, Error> {
+ unsafe {
+ self.take()
+ .serialize_tuple_struct(name, len)
+ .unsafe_map(TupleStruct::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_tuple_variant(
+ &mut self,
+ name: &'static str,
+ variant_index: u32,
+ variant: &'static str,
+ len: usize,
+ ) -> Result<TupleVariant, Error> {
+ unsafe {
+ self.take()
+ .serialize_tuple_variant(name, variant_index, variant, len)
+ .unsafe_map(TupleVariant::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_map(&mut self, len: Option<usize>) -> Result<Map, Error> {
+ unsafe {
+ self.take()
+ .serialize_map(len)
+ .unsafe_map(Map::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_struct(&mut self, name: &'static str, len: usize) -> Result<Struct, Error> {
+ unsafe {
+ self.take()
+ .serialize_struct(name, len)
+ .unsafe_map(Struct::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_serialize_struct_variant(
+ &mut self,
+ name: &'static str,
+ variant_index: u32,
+ variant: &'static str,
+ len: usize,
+ ) -> Result<StructVariant, Error> {
+ unsafe {
+ self.take()
+ .serialize_struct_variant(name, variant_index, variant, len)
+ .unsafe_map(StructVariant::new)
+ .map_err(erase)
+ }
+ }
+
+ fn erased_is_human_readable(&self) -> bool {
+ self.as_ref().is_human_readable()
+ }
+}
+
+// IMPL SERDE FOR ERASED SERDE /////////////////////////////////////////////////
+
+/// Serialize the given type-erased serializable value.
+///
+/// This can be used to implement `serde::Serialize` for trait objects that have
+/// `erased_serde::Serialize` as a supertrait.
+///
+/// ```
+/// trait Event: erased_serde::Serialize {
+/// /* ... */
+/// }
+///
+/// impl<'a> serde::Serialize for dyn Event + 'a {
+/// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
+/// where S: serde::Serializer
+/// {
+/// erased_serde::serialize(self, serializer)
+/// }
+/// }
+/// ```
+///
+/// Since this is reasonably common, the `serialize_trait_object!` macro
+/// generates such a Serialize impl.
+///
+/// ```
+/// use erased_serde::serialize_trait_object;
+/// #
+/// # trait Event: erased_serde::Serialize {}
+///
+/// serialize_trait_object!(Event);
+/// ```
+pub fn serialize<T, S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
+where
+ T: ?Sized + Serialize,
+ S: serde::Serializer,
+{
+ let mut erased = erase::Serializer {
+ state: Some(serializer),
+ };
+ unsafe {
+ value
+ .erased_serialize(&mut erased)
+ .unsafe_map(Ok::take)
+ .map_err(unerase)
+ }
+}
+
+serialize_trait_object!(Serialize);
+
+macro_rules! impl_serializer_for_trait_object {
+ ($ty:ty) => {
+ impl<'a> serde::Serializer for $ty {
+ type Ok = Ok;
+ type Error = Error;
+ type SerializeSeq = Seq<'a>;
+ type SerializeTuple = Tuple<'a>;
+ type SerializeTupleStruct = TupleStruct<'a>;
+ type SerializeTupleVariant = TupleVariant<'a>;
+ type SerializeMap = Map<'a>;
+ type SerializeStruct = Struct<'a>;
+ type SerializeStructVariant = StructVariant<'a>;
+
+ fn serialize_bool(self, v: bool) -> Result<Ok, Error> {
+ self.erased_serialize_bool(v)
+ }
+
+ fn serialize_i8(self, v: i8) -> Result<Ok, Error> {
+ self.erased_serialize_i8(v)
+ }
+
+ fn serialize_i16(self, v: i16) -> Result<Ok, Error> {
+ self.erased_serialize_i16(v)
+ }
+
+ fn serialize_i32(self, v: i32) -> Result<Ok, Error> {
+ self.erased_serialize_i32(v)
+ }
+
+ fn serialize_i64(self, v: i64) -> Result<Ok, Error> {
+ self.erased_serialize_i64(v)
+ }
+
+ fn serialize_i128(self, v: i128) -> Result<Ok, Error> {
+ self.erased_serialize_i128(v)
+ }
+
+ fn serialize_u8(self, v: u8) -> Result<Ok, Error> {
+ self.erased_serialize_u8(v)
+ }
+
+ fn serialize_u16(self, v: u16) -> Result<Ok, Error> {
+ self.erased_serialize_u16(v)
+ }
+
+ fn serialize_u32(self, v: u32) -> Result<Ok, Error> {
+ self.erased_serialize_u32(v)
+ }
+
+ fn serialize_u64(self, v: u64) -> Result<Ok, Error> {
+ self.erased_serialize_u64(v)
+ }
+
+ fn serialize_u128(self, v: u128) -> Result<Ok, Error> {
+ self.erased_serialize_u128(v)
+ }
+
+ fn serialize_f32(self, v: f32) -> Result<Ok, Error> {
+ self.erased_serialize_f32(v)
+ }
+
+ fn serialize_f64(self, v: f64) -> Result<Ok, Error> {
+ self.erased_serialize_f64(v)
+ }
+
+ fn serialize_char(self, v: char) -> Result<Ok, Error> {
+ self.erased_serialize_char(v)
+ }
+
+ fn serialize_str(self, v: &str) -> Result<Ok, Error> {
+ self.erased_serialize_str(v)
+ }
+
+ fn serialize_bytes(self, v: &[u8]) -> Result<Ok, Error> {
+ self.erased_serialize_bytes(v)
+ }
+
+ fn serialize_none(self) -> Result<Ok, Error> {
+ self.erased_serialize_none()
+ }
+
+ fn serialize_some<T>(self, v: &T) -> Result<Ok, Error>
+ where
+ T: ?Sized + serde::Serialize,
+ {
+ self.erased_serialize_some(&v)
+ }
+
+ fn serialize_unit(self) -> Result<Ok, Error> {
+ self.erased_serialize_unit()
+ }
+
+ fn serialize_unit_struct(self, name: &'static str) -> Result<Ok, Error> {
+ self.erased_serialize_unit_struct(name)
+ }
+
+ fn serialize_unit_variant(
+ self,
+ name: &'static str,
+ variant_index: u32,
+ variant: &'static str,
+ ) -> Result<Ok, Error> {
+ self.erased_serialize_unit_variant(name, variant_index, variant)
+ }
+
+ fn serialize_newtype_struct<T>(self, name: &'static str, v: &T) -> Result<Ok, Error>
+ where
+ T: ?Sized + serde::Serialize,
+ {
+ self.erased_serialize_newtype_struct(name, &v)
+ }
+
+ fn serialize_newtype_variant<T>(
+ self,
+ name: &'static str,
+ variant_index: u32,
+ variant: &'static str,
+ v: &T,
+ ) -> Result<Ok, Error>
+ where
+ T: ?Sized + serde::Serialize,
+ {
+ self.erased_serialize_newtype_variant(name, variant_index, variant, &v)
+ }
+
+ fn serialize_seq(self, len: Option<usize>) -> Result<Seq<'a>, Error> {
+ self.erased_serialize_seq(len)
+ }
+
+ fn serialize_tuple(self, len: usize) -> Result<Tuple<'a>, Error> {
+ self.erased_serialize_tuple(len)
+ }
+
+ fn serialize_tuple_struct(
+ self,
+ name: &'static str,
+ len: usize,
+ ) -> Result<TupleStruct<'a>, Error> {
+ self.erased_serialize_tuple_struct(name, len)
+ }
+
+ fn serialize_tuple_variant(
+ self,
+ name: &'static str,
+ variant_index: u32,
+ variant: &'static str,
+ len: usize,
+ ) -> Result<TupleVariant<'a>, Error> {
+ self.erased_serialize_tuple_variant(name, variant_index, variant, len)
+ }
+
+ fn serialize_map(self, len: Option<usize>) -> Result<Map<'a>, Error> {
+ self.erased_serialize_map(len)
+ }
+
+ fn serialize_struct(self, name: &'static str, len: usize) -> Result<Struct<'a>, Error> {
+ self.erased_serialize_struct(name, len)
+ }
+
+ fn serialize_struct_variant(
+ self,
+ name: &'static str,
+ variant_index: u32,
+ variant: &'static str,
+ len: usize,
+ ) -> Result<StructVariant<'a>, Error> {
+ self.erased_serialize_struct_variant(name, variant_index, variant, len)
+ }
+
+ #[cfg(not(any(feature = "std", feature = "alloc")))]
+ fn collect_str<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
+ where
+ T: ?Sized + Display,
+ {
+ unreachable!()
+ }
+
+ fn is_human_readable(&self) -> bool {
+ self.erased_is_human_readable()
+ }
+ }
+ };
+}
+
+impl_serializer_for_trait_object!(&'a mut (dyn Serializer + '_));
+impl_serializer_for_trait_object!(&'a mut (dyn Serializer + Send + '_));
+impl_serializer_for_trait_object!(&'a mut (dyn Serializer + Sync + '_));
+impl_serializer_for_trait_object!(&'a mut (dyn Serializer + Send + Sync + '_));
+
+pub struct Seq<'a> {
+ data: Any,
+ serialize_element: unsafe fn(&mut Any, &dyn Serialize) -> Result<(), Error>,
+ end: unsafe fn(Any) -> Result<Ok, Error>,
+ lifetime: PhantomData<&'a dyn Serializer>,
+}
+
+impl<'a> Seq<'a> {
+ unsafe fn new<T>(data: T) -> Self
+ where
+ T: serde::ser::SerializeSeq,
+ {
+ Seq {
+ data: unsafe { Any::new(data) },
+ serialize_element: {
+ unsafe fn serialize_element<T>(
+ data: &mut Any,
+ v: &dyn Serialize,
+ ) -> Result<(), Error>
+ where
+ T: serde::ser::SerializeSeq,
+ {
+ unsafe { data.view::<T>().serialize_element(v).map_err(erase) }
+ }
+ serialize_element::<T>
+ },
+ end: {
+ unsafe fn end<T>(data: Any) -> Result<Ok, Error>
+ where
+ T: serde::ser::SerializeSeq,
+ {
+ unsafe { data.take::<T>().end().unsafe_map(Ok::new).map_err(erase) }
+ }
+ end::<T>
+ },
+ lifetime: PhantomData,
+ }
+ }
+}
+
+impl<'a> SerializeSeq for Seq<'a> {
+ type Ok = Ok;
+ type Error = Error;
+
+ fn serialize_element<T>(&mut self, value: &T) -> Result<(), Error>
+ where
+ T: ?Sized + serde::Serialize,
+ {
+ unsafe { (self.serialize_element)(&mut self.data, &value) }
+ }
+
+ fn end(self) -> Result<Ok, Error> {
+ unsafe { (self.end)(self.data) }
+ }
+}
+
+pub struct Tuple<'a> {
+ data: Any,
+ serialize_element: unsafe fn(&mut Any, &dyn Serialize) -> Result<(), Error>,
+ end: unsafe fn(Any) -> Result<Ok, Error>,
+ lifetime: PhantomData<&'a dyn Serializer>,
+}
+
+impl<'a> Tuple<'a> {
+ unsafe fn new<T>(data: T) -> Self
+ where
+ T: serde::ser::SerializeTuple,
+ {
+ Tuple {
+ data: unsafe { Any::new(data) },
+ serialize_element: {
+ unsafe fn serialize_element<T>(
+ data: &mut Any,
+ v: &dyn Serialize,
+ ) -> Result<(), Error>
+ where
+ T: serde::ser::SerializeTuple,
+ {
+ unsafe { data.view::<T>().serialize_element(v).map_err(erase) }
+ }
+ serialize_element::<T>
+ },
+ end: {
+ unsafe fn end<T>(data: Any) -> Result<Ok, Error>
+ where
+ T: serde::ser::SerializeTuple,
+ {
+ unsafe { data.take::<T>().end().unsafe_map(Ok::new).map_err(erase) }
+ }
+ end::<T>
+ },
+ lifetime: PhantomData,
+ }
+ }
+}
+
+impl<'a> SerializeTuple for Tuple<'a> {
+ type Ok = Ok;
+ type Error = Error;
+
+ fn serialize_element<T>(&mut self, value: &T) -> Result<(), Error>
+ where
+ T: ?Sized + serde::Serialize,
+ {
+ unsafe { (self.serialize_element)(&mut self.data, &value) }
+ }
+
+ fn end(self) -> Result<Ok, Error> {
+ unsafe { (self.end)(self.data) }
+ }
+}
+
+pub struct TupleStruct<'a> {
+ data: Any,
+ serialize_field: unsafe fn(&mut Any, &dyn Serialize) -> Result<(), Error>,
+ end: unsafe fn(Any) -> Result<Ok, Error>,
+ lifetime: PhantomData<&'a dyn Serializer>,
+}
+
+impl<'a> TupleStruct<'a> {
+ unsafe fn new<T>(data: T) -> Self
+ where
+ T: serde::ser::SerializeTupleStruct,
+ {
+ TupleStruct {
+ data: unsafe { Any::new(data) },
+ serialize_field: {
+ unsafe fn serialize_field<T>(data: &mut Any, v: &dyn Serialize) -> Result<(), Error>
+ where
+ T: serde::ser::SerializeTupleStruct,
+ {
+ unsafe { data.view::<T>().serialize_field(v).map_err(erase) }
+ }
+ serialize_field::<T>
+ },
+ end: {
+ unsafe fn end<T>(data: Any) -> Result<Ok, Error>
+ where
+ T: serde::ser::SerializeTupleStruct,
+ {
+ unsafe { data.take::<T>().end().unsafe_map(Ok::new).map_err(erase) }
+ }
+ end::<T>
+ },
+ lifetime: PhantomData,
+ }
+ }
+}
+
+impl<'a> SerializeTupleStruct for TupleStruct<'a> {
+ type Ok = Ok;
+ type Error = Error;
+
+ fn serialize_field<T>(&mut self, value: &T) -> Result<(), Error>
+ where
+ T: ?Sized + serde::Serialize,
+ {
+ unsafe { (self.serialize_field)(&mut self.data, &value) }
+ }
+
+ fn end(self) -> Result<Ok, Error> {
+ unsafe { (self.end)(self.data) }
+ }
+}
+
+pub struct TupleVariant<'a> {
+ data: Any,
+ serialize_field: unsafe fn(&mut Any, &dyn Serialize) -> Result<(), Error>,
+ end: unsafe fn(Any) -> Result<Ok, Error>,
+ lifetime: PhantomData<&'a dyn Serializer>,
+}
+
+impl<'a> TupleVariant<'a> {
+ unsafe fn new<T>(data: T) -> Self
+ where
+ T: serde::ser::SerializeTupleVariant,
+ {
+ TupleVariant {
+ data: unsafe { Any::new(data) },
+ serialize_field: {
+ unsafe fn serialize_field<T>(data: &mut Any, v: &dyn Serialize) -> Result<(), Error>
+ where
+ T: serde::ser::SerializeTupleVariant,
+ {
+ unsafe { data.view::<T>().serialize_field(v).map_err(erase) }
+ }
+ serialize_field::<T>
+ },
+ end: {
+ unsafe fn end<T>(data: Any) -> Result<Ok, Error>
+ where
+ T: serde::ser::SerializeTupleVariant,
+ {
+ unsafe { data.take::<T>().end().unsafe_map(Ok::new).map_err(erase) }
+ }
+ end::<T>
+ },
+ lifetime: PhantomData,
+ }
+ }
+}
+
+impl<'a> SerializeTupleVariant for TupleVariant<'a> {
+ type Ok = Ok;
+ type Error = Error;
+
+ fn serialize_field<T>(&mut self, value: &T) -> Result<(), Error>
+ where
+ T: ?Sized + serde::Serialize,
+ {
+ unsafe { (self.serialize_field)(&mut self.data, &value) }
+ }
+
+ fn end(self) -> Result<Ok, Error> {
+ unsafe { (self.end)(self.data) }
+ }
+}
+
+pub struct Map<'a> {
+ data: Any,
+ serialize_key: unsafe fn(&mut Any, &dyn Serialize) -> Result<(), Error>,
+ serialize_value: unsafe fn(&mut Any, &dyn Serialize) -> Result<(), Error>,
+ serialize_entry: unsafe fn(&mut Any, &dyn Serialize, &dyn Serialize) -> Result<(), Error>,
+ end: unsafe fn(Any) -> Result<Ok, Error>,
+ lifetime: PhantomData<&'a dyn Serializer>,
+}
+
+impl<'a> Map<'a> {
+ unsafe fn new<T>(data: T) -> Self
+ where
+ T: serde::ser::SerializeMap,
+ {
+ Map {
+ data: unsafe { Any::new(data) },
+ serialize_key: {
+ unsafe fn serialize_key<T>(data: &mut Any, v: &dyn Serialize) -> Result<(), Error>
+ where
+ T: serde::ser::SerializeMap,
+ {
+ unsafe { data.view::<T>().serialize_key(v).map_err(erase) }
+ }
+ serialize_key::<T>
+ },
+ serialize_value: {
+ unsafe fn serialize_value<T>(data: &mut Any, v: &dyn Serialize) -> Result<(), Error>
+ where
+ T: serde::ser::SerializeMap,
+ {
+ unsafe { data.view::<T>().serialize_value(v).map_err(erase) }
+ }
+ serialize_value::<T>
+ },
+ serialize_entry: {
+ unsafe fn serialize_entry<T>(
+ data: &mut Any,
+ k: &dyn Serialize,
+ v: &dyn Serialize,
+ ) -> Result<(), Error>
+ where
+ T: serde::ser::SerializeMap,
+ {
+ unsafe { data.view::<T>().serialize_entry(k, v).map_err(erase) }
+ }
+ serialize_entry::<T>
+ },
+ end: {
+ unsafe fn end<T>(data: Any) -> Result<Ok, Error>
+ where
+ T: serde::ser::SerializeMap,
+ {
+ unsafe { data.take::<T>().end().unsafe_map(Ok::new).map_err(erase) }
+ }
+ end::<T>
+ },
+ lifetime: PhantomData,
+ }
+ }
+}
+
+impl<'a> SerializeMap for Map<'a> {
+ type Ok = Ok;
+ type Error = Error;
+
+ fn serialize_key<T>(&mut self, key: &T) -> Result<(), Error>
+ where
+ T: ?Sized + serde::Serialize,
+ {
+ unsafe { (self.serialize_key)(&mut self.data, &key) }
+ }
+
+ fn serialize_value<T>(&mut self, value: &T) -> Result<(), Error>
+ where
+ T: ?Sized + serde::Serialize,
+ {
+ unsafe { (self.serialize_value)(&mut self.data, &value) }
+ }
+
+ fn serialize_entry<K, V>(&mut self, key: &K, value: &V) -> Result<(), Error>
+ where
+ K: ?Sized + serde::Serialize,
+ V: ?Sized + serde::Serialize,
+ {
+ unsafe { (self.serialize_entry)(&mut self.data, &key, &value) }
+ }
+
+ fn end(self) -> Result<Ok, Error> {
+ unsafe { (self.end)(self.data) }
+ }
+}
+
+pub struct Struct<'a> {
+ data: Any,
+ serialize_field: unsafe fn(&mut Any, &'static str, &dyn Serialize) -> Result<(), Error>,
+ end: unsafe fn(Any) -> Result<Ok, Error>,
+ lifetime: PhantomData<&'a dyn Serializer>,
+}
+
+impl<'a> Struct<'a> {
+ unsafe fn new<T>(data: T) -> Self
+ where
+ T: serde::ser::SerializeStruct,
+ {
+ Struct {
+ data: unsafe { Any::new(data) },
+ serialize_field: {
+ unsafe fn serialize_field<T>(
+ data: &mut Any,
+ k: &'static str,
+ v: &dyn Serialize,
+ ) -> Result<(), Error>
+ where
+ T: serde::ser::SerializeStruct,
+ {
+ unsafe { data.view::<T>().serialize_field(k, v).map_err(erase) }
+ }
+ serialize_field::<T>
+ },
+ end: {
+ unsafe fn end<T>(data: Any) -> Result<Ok, Error>
+ where
+ T: serde::ser::SerializeStruct,
+ {
+ unsafe { data.take::<T>().end().unsafe_map(Ok::new).map_err(erase) }
+ }
+ end::<T>
+ },
+ lifetime: PhantomData,
+ }
+ }
+}
+
+impl<'a> SerializeStruct for Struct<'a> {
+ type Ok = Ok;
+ type Error = Error;
+
+ fn serialize_field<T>(&mut self, name: &'static str, field: &T) -> Result<(), Error>
+ where
+ T: ?Sized + serde::Serialize,
+ {
+ unsafe { (self.serialize_field)(&mut self.data, name, &field) }
+ }
+
+ fn end(self) -> Result<Ok, Error> {
+ unsafe { (self.end)(self.data) }
+ }
+}
+
+pub struct StructVariant<'a> {
+ data: Any,
+ serialize_field: unsafe fn(&mut Any, &'static str, &dyn Serialize) -> Result<(), Error>,
+ end: unsafe fn(Any) -> Result<Ok, Error>,
+ lifetime: PhantomData<&'a dyn Serializer>,
+}
+
+impl<'a> StructVariant<'a> {
+ unsafe fn new<T>(data: T) -> Self
+ where
+ T: serde::ser::SerializeStructVariant,
+ {
+ StructVariant {
+ data: unsafe { Any::new(data) },
+ serialize_field: {
+ unsafe fn serialize_field<T>(
+ data: &mut Any,
+ k: &'static str,
+ v: &dyn Serialize,
+ ) -> Result<(), Error>
+ where
+ T: serde::ser::SerializeStructVariant,
+ {
+ unsafe { data.view::<T>().serialize_field(k, v).map_err(erase) }
+ }
+ serialize_field::<T>
+ },
+ end: {
+ unsafe fn end<T>(data: Any) -> Result<Ok, Error>
+ where
+ T: serde::ser::SerializeStructVariant,
+ {
+ unsafe { data.take::<T>().end().unsafe_map(Ok::new).map_err(erase) }
+ }
+ end::<T>
+ },
+ lifetime: PhantomData,
+ }
+ }
+}
+
+impl<'a> SerializeStructVariant for StructVariant<'a> {
+ type Ok = Ok;
+ type Error = Error;
+
+ fn serialize_field<T>(&mut self, name: &'static str, field: &T) -> Result<(), Error>
+ where
+ T: ?Sized + serde::Serialize,
+ {
+ unsafe { (self.serialize_field)(&mut self.data, name, &field) }
+ }
+
+ fn end(self) -> Result<Ok, Error> {
+ unsafe { (self.end)(self.data) }
+ }
+}
+
+// IMPL ERASED SERDE FOR ERASED SERDE //////////////////////////////////////////
+
+macro_rules! deref_erased_serializer {
+ ($($imp:tt)+) => {
+ impl $($imp)+ {
+ fn erased_serialize_bool(&mut self, v: bool) -> Result<Ok, Error> {
+ (**self).erased_serialize_bool(v)
+ }
+
+ fn erased_serialize_i8(&mut self, v: i8) -> Result<Ok, Error> {
+ (**self).erased_serialize_i8(v)
+ }
+
+ fn erased_serialize_i16(&mut self, v: i16) -> Result<Ok, Error> {
+ (**self).erased_serialize_i16(v)
+ }
+
+ fn erased_serialize_i32(&mut self, v: i32) -> Result<Ok, Error> {
+ (**self).erased_serialize_i32(v)
+ }
+
+ fn erased_serialize_i64(&mut self, v: i64) -> Result<Ok, Error> {
+ (**self).erased_serialize_i64(v)
+ }
+
+ fn erased_serialize_i128(&mut self, v: i128) -> Result<Ok, Error> {
+ (**self).erased_serialize_i128(v)
+ }
+
+ fn erased_serialize_u8(&mut self, v: u8) -> Result<Ok, Error> {
+ (**self).erased_serialize_u8(v)
+ }
+
+ fn erased_serialize_u16(&mut self, v: u16) -> Result<Ok, Error> {
+ (**self).erased_serialize_u16(v)
+ }
+
+ fn erased_serialize_u32(&mut self, v: u32) -> Result<Ok, Error> {
+ (**self).erased_serialize_u32(v)
+ }
+
+ fn erased_serialize_u64(&mut self, v: u64) -> Result<Ok, Error> {
+ (**self).erased_serialize_u64(v)
+ }
+
+ fn erased_serialize_u128(&mut self, v: u128) -> Result<Ok, Error> {
+ (**self).erased_serialize_u128(v)
+ }
+
+ fn erased_serialize_f32(&mut self, v: f32) -> Result<Ok, Error> {
+ (**self).erased_serialize_f32(v)
+ }
+
+ fn erased_serialize_f64(&mut self, v: f64) -> Result<Ok, Error> {
+ (**self).erased_serialize_f64(v)
+ }
+
+ fn erased_serialize_char(&mut self, v: char) -> Result<Ok, Error> {
+ (**self).erased_serialize_char(v)
+ }
+
+ fn erased_serialize_str(&mut self, v: &str) -> Result<Ok, Error> {
+ (**self).erased_serialize_str(v)
+ }
+
+ fn erased_serialize_bytes(&mut self, v: &[u8]) -> Result<Ok, Error> {
+ (**self).erased_serialize_bytes(v)
+ }
+
+ fn erased_serialize_none(&mut self) -> Result<Ok, Error> {
+ (**self).erased_serialize_none()
+ }
+
+ fn erased_serialize_some(&mut self, v: &dyn Serialize) -> Result<Ok, Error> {
+ (**self).erased_serialize_some(v)
+ }
+
+ fn erased_serialize_unit(&mut self) -> Result<Ok, Error> {
+ (**self).erased_serialize_unit()
+ }
+
+ fn erased_serialize_unit_struct(&mut self, name: &'static str) -> Result<Ok, Error> {
+ (**self).erased_serialize_unit_struct(name)
+ }
+
+ fn erased_serialize_unit_variant(&mut self, name: &'static str, variant_index: u32, variant: &'static str) -> Result<Ok, Error> {
+ (**self).erased_serialize_unit_variant(name, variant_index, variant)
+ }
+
+ fn erased_serialize_newtype_struct(&mut self, name: &'static str, v: &dyn Serialize) -> Result<Ok, Error> {
+ (**self).erased_serialize_newtype_struct(name, v)
+ }
+
+ fn erased_serialize_newtype_variant(&mut self, name: &'static str, variant_index: u32, variant: &'static str, v: &dyn Serialize) -> Result<Ok, Error> {
+ (**self).erased_serialize_newtype_variant(name, variant_index, variant, v)
+ }
+
+ fn erased_serialize_seq(&mut self, len: Option<usize>) -> Result<Seq, Error> {
+ (**self).erased_serialize_seq(len)
+ }
+
+ fn erased_serialize_tuple(&mut self, len: usize) -> Result<Tuple, Error> {
+ (**self).erased_serialize_tuple(len)
+ }
+
+ fn erased_serialize_tuple_struct(&mut self, name: &'static str, len: usize) -> Result<TupleStruct, Error> {
+ (**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<TupleVariant, Error> {
+ (**self).erased_serialize_tuple_variant(name, variant_index, variant, len)
+ }
+
+ fn erased_serialize_map(&mut self, len: Option<usize>) -> Result<Map, Error> {
+ (**self).erased_serialize_map(len)
+ }
+
+ fn erased_serialize_struct(&mut self, name: &'static str, len: usize) -> Result<Struct, Error> {
+ (**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<StructVariant, Error> {
+ (**self).erased_serialize_struct_variant(name, variant_index, variant, len)
+ }
+
+ fn erased_is_human_readable(&self) -> bool {
+ (**self).erased_is_human_readable()
+ }
+ }
+ };
+}
+
+deref_erased_serializer!(<'a> Serializer for Box<dyn Serializer + 'a>);
+deref_erased_serializer!(<'a> Serializer for Box<dyn Serializer + Send + 'a>);
+deref_erased_serializer!(<'a> Serializer for Box<dyn Serializer + Sync + 'a>);
+deref_erased_serializer!(<'a> Serializer for Box<dyn Serializer + Send + Sync + 'a>);
+deref_erased_serializer!(<'a, T: ?Sized + Serializer> Serializer for &'a mut T);
+
+// ERROR ///////////////////////////////////////////////////////////////////////
+
+fn erase<E>(e: E) -> Error
+where
+ E: Display,
+{
+ serde::ser::Error::custom(e)
+}
+
+fn unerase<E>(e: Error) -> E
+where
+ E: serde::ser::Error,
+{
+ E::custom(e)
+}
+
+// TEST ////////////////////////////////////////////////////////////////////////
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::alloc::{vec, Vec};
+ use serde_derive::Serialize;
+
+ fn test_json<T>(t: T)
+ where
+ T: serde::Serialize,
+ {
+ let expected = serde_json::to_vec(&t).unwrap();
+
+ // test borrowed trait object
+ {
+ let obj: &dyn Serialize = &t;
+
+ let mut buf = Vec::new();
+
+ {
+ let mut ser = serde_json::Serializer::new(&mut buf);
+ let ser: &mut dyn Serializer = &mut <dyn Serializer>::erase(&mut ser);
+
+ obj.erased_serialize(ser).unwrap();
+ }
+
+ assert_eq!(buf, expected);
+ }
+
+ // test boxed trait object
+ {
+ let obj: Box<dyn Serialize> = Box::new(t);
+
+ let mut buf = Vec::new();
+
+ {
+ let mut ser = serde_json::Serializer::new(&mut buf);
+ let mut ser: Box<dyn Serializer> = Box::new(<dyn Serializer>::erase(&mut ser));
+
+ obj.erased_serialize(&mut ser).unwrap();
+ }
+
+ assert_eq!(buf, expected);
+ }
+ }
+
+ #[test]
+ fn test_vec() {
+ test_json(vec!["a", "b"]);
+ }
+
+ #[test]
+ fn test_struct() {
+ #[derive(Serialize)]
+ struct S {
+ f: usize,
+ }
+
+ test_json(S { f: 256 });
+ }
+
+ #[test]
+ fn test_enum() {
+ #[derive(Serialize)]
+ enum E {
+ Unit,
+ Newtype(bool),
+ Tuple(bool, bool),
+ Struct { t: bool, f: bool },
+ }
+
+ test_json(E::Unit);
+ test_json(E::Newtype(true));
+ test_json(E::Tuple(true, false));
+ test_json(E::Struct { t: true, f: false });
+ }
+
+ #[test]
+ fn assert_serialize() {
+ fn assert<T: serde::Serialize>() {}
+
+ assert::<&dyn Serialize>();
+ assert::<&(dyn Serialize + Send)>();
+ assert::<&(dyn Serialize + Sync)>();
+ assert::<&(dyn Serialize + Send + Sync)>();
+ assert::<&(dyn Serialize + Sync + Send)>();
+ assert::<Vec<&dyn Serialize>>();
+ assert::<Vec<&(dyn Serialize + Send)>>();
+
+ assert::<Box<dyn Serialize>>();
+ assert::<Box<dyn Serialize + Send>>();
+ assert::<Box<dyn Serialize + Sync>>();
+ assert::<Box<dyn Serialize + Send + Sync>>();
+ assert::<Box<dyn Serialize + Sync + Send>>();
+ assert::<Vec<Box<dyn Serialize>>>();
+ assert::<Vec<Box<dyn Serialize + Send>>>();
+ }
+
+ #[test]
+ fn assert_serializer() {
+ fn assert<T: serde::Serializer>() {}
+
+ assert::<&mut dyn Serializer>();
+ assert::<&mut (dyn Serializer + Send)>();
+ assert::<&mut (dyn Serializer + Sync)>();
+ assert::<&mut (dyn Serializer + Send + Sync)>();
+ assert::<&mut (dyn Serializer + Sync + Send)>();
+ }
+}