| use crate::{ByteArray, 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<S>(&self, serializer: S) -> Result<S::Ok, S::Error> |
| where |
| S: Serializer; |
| } |
| |
| impl Serialize for [u8] { |
| fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> |
| where |
| S: Serializer, |
| { |
| serializer.serialize_bytes(self) |
| } |
| } |
| |
| #[cfg(any(feature = "std", feature = "alloc"))] |
| impl Serialize for Vec<u8> { |
| fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> |
| where |
| S: Serializer, |
| { |
| serializer.serialize_bytes(self) |
| } |
| } |
| |
| impl Serialize for Bytes { |
| fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> |
| where |
| S: Serializer, |
| { |
| serializer.serialize_bytes(self) |
| } |
| } |
| |
| impl<const N: usize> Serialize for [u8; N] { |
| fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> |
| where |
| S: Serializer, |
| { |
| serializer.serialize_bytes(self) |
| } |
| } |
| |
| impl<const N: usize> Serialize for ByteArray<N> { |
| fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> |
| where |
| S: Serializer, |
| { |
| serializer.serialize_bytes(&**self) |
| } |
| } |
| |
| #[cfg(any(feature = "std", feature = "alloc"))] |
| impl Serialize for ByteBuf { |
| fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> |
| where |
| S: Serializer, |
| { |
| serializer.serialize_bytes(self) |
| } |
| } |
| |
| #[cfg(any(feature = "std", feature = "alloc"))] |
| impl<'a> Serialize for Cow<'a, [u8]> { |
| fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> |
| where |
| S: Serializer, |
| { |
| serializer.serialize_bytes(self) |
| } |
| } |
| |
| #[cfg(any(feature = "std", feature = "alloc"))] |
| impl<'a> Serialize for Cow<'a, Bytes> { |
| fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> |
| where |
| S: Serializer, |
| { |
| serializer.serialize_bytes(self) |
| } |
| } |
| |
| impl<T> Serialize for &T |
| where |
| T: ?Sized + Serialize, |
| { |
| fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> |
| where |
| S: Serializer, |
| { |
| (**self).serialize(serializer) |
| } |
| } |
| |
| #[cfg(any(feature = "std", feature = "alloc"))] |
| impl<T> Serialize for Box<T> |
| where |
| T: ?Sized + Serialize, |
| { |
| fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> |
| where |
| S: Serializer, |
| { |
| (**self).serialize(serializer) |
| } |
| } |
| |
| impl<T> Serialize for Option<T> |
| where |
| T: Serialize, |
| { |
| fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> |
| where |
| S: Serializer, |
| { |
| struct AsBytes<T>(T); |
| |
| impl<T> serde::Serialize for AsBytes<T> |
| where |
| T: Serialize, |
| { |
| fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> |
| where |
| S: Serializer, |
| { |
| self.0.serialize(serializer) |
| } |
| } |
| |
| match self { |
| Some(b) => serializer.serialize_some(&AsBytes(b)), |
| None => serializer.serialize_none(), |
| } |
| } |
| } |