use crate::Bytes; use serde::Serializer; #[cfg(any(feature = "std", feature = "alloc"))] use crate::ByteBuf; #[cfg(feature = "alloc")] use alloc::borrow::Cow; #[cfg(all(feature = "std", not(feature = "alloc")))] use std::borrow::Cow; #[cfg(feature = "alloc")] use alloc::boxed::Box; #[cfg(feature = "alloc")] use alloc::vec::Vec; /// Types that can be serialized via `#[serde(with = "serde_bytes")]`. pub trait Serialize { #[allow(missing_docs)] fn serialize(&self, serializer: S) -> Result where S: Serializer; } impl Serialize for [u8] { fn serialize(&self, serializer: S) -> Result where S: Serializer, { serializer.serialize_bytes(self) } } #[cfg(any(feature = "std", feature = "alloc"))] impl Serialize for Vec { fn serialize(&self, serializer: S) -> Result where S: Serializer, { serializer.serialize_bytes(self) } } impl Serialize for Bytes { fn serialize(&self, serializer: S) -> Result where S: Serializer, { serializer.serialize_bytes(self) } } #[cfg(any(feature = "std", feature = "alloc"))] impl Serialize for ByteBuf { fn serialize(&self, serializer: S) -> Result where S: Serializer, { serializer.serialize_bytes(self) } } #[cfg(any(feature = "std", feature = "alloc"))] impl<'a> Serialize for Cow<'a, [u8]> { fn serialize(&self, serializer: S) -> Result where S: Serializer, { serializer.serialize_bytes(self) } } #[cfg(any(feature = "std", feature = "alloc"))] impl<'a> Serialize for Cow<'a, Bytes> { fn serialize(&self, serializer: S) -> Result where S: Serializer, { serializer.serialize_bytes(self) } } impl<'a, T> Serialize for &'a T where T: ?Sized + Serialize, { fn serialize(&self, serializer: S) -> Result where S: Serializer, { (**self).serialize(serializer) } } #[cfg(any(feature = "std", feature = "alloc"))] impl Serialize for Box where T: ?Sized + Serialize, { fn serialize(&self, serializer: S) -> Result where S: Serializer, { (**self).serialize(serializer) } } impl Serialize for Option where T: Serialize, { fn serialize(&self, serializer: S) -> Result where S: Serializer, { struct AsBytes(T); impl serde::Serialize for AsBytes where T: Serialize, { fn serialize(&self, serializer: S) -> Result where S: Serializer, { self.0.serialize(serializer) } } match self { Some(b) => serializer.serialize_some(&AsBytes(b)), None => serializer.serialize_none(), } } }