use core::convert::Infallible;
use crate::ser::flavors::{Flavor, Slice};
use flavors::BufferFull;
use serde_core::Serialize;
use serializer::SerializerError;
#[cfg(any(feature = "alloc", feature = "std"))]
use crate::ser::flavors::AllocVec;
#[cfg(any(feature = "alloc", feature = "std"))]
extern crate alloc;
use crate::ser::serializer::Serializer;
pub mod flavors;
pub(crate) mod serializer;
pub fn to_slice<'a, 'b, T>(
value: &'b T,
buf: &'a mut [u8],
) -> Result<&'a mut [u8], SerializerError<BufferFull, Infallible>>
where
T: Serialize + ?Sized,
{
serialize_with_flavor::<T, Slice<'a>>(value, Slice::new(buf))
}
#[cfg(any(feature = "alloc", feature = "std"))]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
pub fn to_vec<T>(value: &T) -> Result<alloc::vec::Vec<u8>, SerializerError<Infallible, Infallible>>
where
T: Serialize + ?Sized,
{
serialize_with_flavor::<T, AllocVec>(value, AllocVec::new())
}
pub fn to_extend<T, W>(value: &T, writer: W) -> Result<W, SerializerError<Infallible, Infallible>>
where
T: Serialize + ?Sized,
W: core::iter::Extend<u8>,
{
serialize_with_flavor::<T, _>(value, flavors::ExtendFlavor::new(writer))
}
#[cfg(feature = "std")]
pub fn to_io<T, W>(
value: &T,
writer: W,
) -> Result<W, SerializerError<std::io::Error, std::io::Error>>
where
T: Serialize + ?Sized,
W: std::io::Write,
{
serialize_with_flavor::<T, _>(value, flavors::io::WriteFlavor::new(writer))
}
pub fn serialize_with_flavor<T, S>(
value: &T,
storage: S,
) -> Result<S::Output, SerializerError<S::PushError, S::FinalizeError>>
where
T: Serialize + ?Sized,
S: Flavor,
{
let mut serializer = Serializer { output: storage };
value.serialize(&mut serializer)?;
serializer
.output
.finalize()
.map_err(SerializerError::FinalizeError)
}
pub fn serialized_size<T>(value: &T) -> Result<usize, SerializerError<Infallible, Infallible>>
where
T: Serialize + ?Sized,
{
serialize_with_flavor::<T, flavors::Size>(value, flavors::Size::default())
}