#[cfg(feature = "alloc")]
use alloc::vec::Vec;
use {
crate::{
ReadResult, SchemaRead, SchemaReadOwned, SchemaWrite, WriteResult,
config::{Config, ConfigCore},
error,
io::{Reader, Writer},
},
core::mem::MaybeUninit,
};
pub trait Serialize<C: Config>: SchemaWrite<C> {
#[cfg(feature = "alloc")]
fn serialize(src: &Self::Src, config: C) -> WriteResult<Vec<u8>> {
let capacity = Self::size_of(src)?;
let mut buffer = Vec::with_capacity(capacity);
let mut writer = buffer.spare_capacity_mut();
Self::serialize_into(writer.by_ref(), src, config)?;
let len = writer.len();
unsafe {
#[allow(clippy::arithmetic_side_effects)]
buffer.set_len(capacity - len);
}
Ok(buffer)
}
#[inline]
#[expect(unused_variables)]
fn serialize_into(mut dst: impl Writer, src: &Self::Src, config: C) -> WriteResult<()> {
Self::write(dst.by_ref(), src)?;
dst.finish()?;
Ok(())
}
#[inline]
#[expect(unused_variables)]
fn serialized_size(src: &Self::Src, config: C) -> WriteResult<u64> {
Self::size_of(src).map(|size| size as u64)
}
}
impl<T, C: Config> Serialize<C> for T where T: SchemaWrite<C> + ?Sized {}
pub trait Deserialize<'de, C: Config>: SchemaRead<'de, C> {
#[inline(always)]
#[expect(unused_variables)]
fn deserialize(src: &'de [u8], config: C) -> ReadResult<Self::Dst> {
Self::get(src)
}
#[inline]
#[expect(unused_variables)]
fn deserialize_into(
src: &'de [u8],
dst: &mut MaybeUninit<Self::Dst>,
config: C,
) -> ReadResult<()> {
Self::read(src, dst)
}
}
impl<'de, T, C: Config> Deserialize<'de, C> for T where T: SchemaRead<'de, C> {}
pub trait DeserializeOwned<C: Config>: SchemaReadOwned<C> {
#[inline(always)]
fn deserialize_from<'de>(
src: impl Reader<'de>,
) -> ReadResult<<Self as SchemaRead<'de, C>>::Dst> {
Self::get(src)
}
#[inline]
fn deserialize_from_into<'de>(
src: impl Reader<'de>,
dst: &mut MaybeUninit<<Self as SchemaRead<'de, C>>::Dst>,
) -> ReadResult<()> {
Self::read(src, dst)
}
}
impl<T, C: Config> DeserializeOwned<C> for T where T: SchemaReadOwned<C> {}
#[cfg(feature = "alloc")]
pub fn serialize<T, C: Config>(src: &T, config: C) -> WriteResult<Vec<u8>>
where
T: SchemaWrite<C, Src = T> + ?Sized,
{
T::serialize(src, config)
}
#[inline]
pub fn serialize_into<T, C: Config>(dst: impl Writer, src: &T, config: C) -> WriteResult<()>
where
T: SchemaWrite<C, Src = T> + ?Sized,
{
T::serialize_into(dst, src, config)
}
#[inline]
pub fn serialized_size<T, C: Config>(src: &T, config: C) -> WriteResult<u64>
where
T: SchemaWrite<C, Src = T> + ?Sized,
{
T::serialized_size(src, config)
}
#[inline(always)]
pub fn deserialize<'de, T, C: Config>(src: &'de [u8], config: C) -> ReadResult<T>
where
T: SchemaRead<'de, C, Dst = T>,
{
T::deserialize(src, config)
}
#[inline(always)]
#[expect(unused_variables)]
pub fn deserialize_exact<'de, T, C: Config>(mut src: &'de [u8], config: C) -> ReadResult<T>
where
T: SchemaRead<'de, C, Dst = T>,
{
let value = T::get(src.by_ref())?;
if src.is_empty() {
Ok(value)
} else {
Err(error::trailing_bytes())
}
}
#[inline(always)]
#[expect(unused_variables)]
pub fn deserialize_mut<'de, T, C: Config>(src: &'de mut [u8], config: C) -> ReadResult<T>
where
T: SchemaRead<'de, C, Dst = T>,
{
T::get(src)
}
#[inline(always)]
#[expect(unused_variables)]
pub fn deserialize_from<'de, T, C: Config>(src: impl Reader<'de>, config: C) -> ReadResult<T>
where
T: SchemaReadOwned<C, Dst = T>,
{
T::deserialize_from(src)
}
pub unsafe trait ZeroCopy<C: ConfigCore>: 'static {
#[inline(always)]
#[expect(unused_variables)]
fn from_bytes<'de>(bytes: &'de [u8], config: C) -> ReadResult<&'de Self>
where
Self: SchemaRead<'de, C, Dst = Self> + Sized,
{
<&Self as SchemaRead<'de, C>>::get(bytes)
}
#[inline(always)]
#[expect(unused_variables)]
fn from_bytes_mut<'de>(bytes: &'de mut [u8], config: C) -> ReadResult<&'de mut Self>
where
Self: SchemaRead<'de, C, Dst = Self> + Sized,
{
<&mut Self as SchemaRead<'de, C>>::get(bytes)
}
}