1#[cfg(feature = "alloc")]
3use alloc::vec::Vec;
4use {
5 crate::{
6 ReadResult, SchemaRead, SchemaReadContext, SchemaReadOwned, SchemaWrite, WriteResult,
7 config::{Config, ConfigCore},
8 error,
9 io::{Reader, Writer},
10 },
11 core::mem::MaybeUninit,
12};
13
14pub trait Serialize<C: Config>: SchemaWrite<C> {
16 #[cfg(feature = "alloc")]
18 fn serialize(src: &Self::Src, config: C) -> WriteResult<Vec<u8>> {
19 let capacity = Self::size_of(src)?;
20 let mut buffer = Vec::with_capacity(capacity);
21 let mut writer = buffer.spare_capacity_mut();
22 Self::serialize_into(writer.by_ref(), src, config)?;
23 let len = writer.len();
24 unsafe {
25 #[allow(clippy::arithmetic_side_effects)]
26 buffer.set_len(capacity - len);
27 }
28 Ok(buffer)
29 }
30
31 #[inline]
33 #[expect(unused_variables)]
34 fn serialize_into(mut dst: impl Writer, src: &Self::Src, config: C) -> WriteResult<()> {
35 Self::write(dst.by_ref(), src)?;
36 dst.finish()?;
37 Ok(())
38 }
39
40 #[inline]
42 #[expect(unused_variables)]
43 fn serialized_size(src: &Self::Src, config: C) -> WriteResult<u64> {
44 Self::size_of(src).map(|size| size as u64)
45 }
46}
47
48impl<T, C: Config> Serialize<C> for T where T: SchemaWrite<C> + ?Sized {}
49
50pub trait Deserialize<'de, C: Config>: SchemaRead<'de, C> {
52 #[inline(always)]
54 #[expect(unused_variables)]
55 fn deserialize(src: &'de [u8], config: C) -> ReadResult<Self::Dst> {
56 Self::get(src)
57 }
58
59 #[inline]
61 #[expect(unused_variables)]
62 fn deserialize_into(
63 src: &'de [u8],
64 dst: &mut MaybeUninit<Self::Dst>,
65 config: C,
66 ) -> ReadResult<()> {
67 Self::read(src, dst)
68 }
69}
70
71impl<'de, T, C: Config> Deserialize<'de, C> for T where T: SchemaRead<'de, C> {}
72
73pub trait DeserializeOwned<C: Config>: SchemaReadOwned<C> {
75 #[inline(always)]
77 fn deserialize_from<'de>(
78 src: impl Reader<'de>,
79 ) -> ReadResult<<Self as SchemaRead<'de, C>>::Dst> {
80 Self::get(src)
81 }
82
83 #[inline]
85 fn deserialize_from_into<'de>(
86 src: impl Reader<'de>,
87 dst: &mut MaybeUninit<<Self as SchemaRead<'de, C>>::Dst>,
88 ) -> ReadResult<()> {
89 Self::read(src, dst)
90 }
91}
92
93impl<T, C: Config> DeserializeOwned<C> for T where T: SchemaReadOwned<C> {}
94
95#[cfg(feature = "alloc")]
109pub fn serialize<T, C: Config>(src: &T, config: C) -> WriteResult<Vec<u8>>
110where
111 T: SchemaWrite<C, Src = T> + ?Sized,
112{
113 T::serialize(src, config)
114}
115
116#[inline]
118pub fn serialize_into<T, C: Config>(dst: impl Writer, src: &T, config: C) -> WriteResult<()>
119where
120 T: SchemaWrite<C, Src = T> + ?Sized,
121{
122 T::serialize_into(dst, src, config)
123}
124
125#[inline]
127pub fn serialized_size<T, C: Config>(src: &T, config: C) -> WriteResult<u64>
128where
129 T: SchemaWrite<C, Src = T> + ?Sized,
130{
131 T::serialized_size(src, config)
132}
133
134#[inline(always)]
150pub fn deserialize<'de, T, C: Config>(src: &'de [u8], config: C) -> ReadResult<T>
151where
152 T: SchemaRead<'de, C, Dst = T>,
153{
154 T::deserialize(src, config)
155}
156
157#[inline(always)]
175#[expect(unused_variables)]
176pub fn deserialize_exact<'de, T, C: Config>(mut src: &'de [u8], config: C) -> ReadResult<T>
177where
178 T: SchemaRead<'de, C, Dst = T>,
179{
180 let value = T::get(src.by_ref())?;
181 if src.is_empty() {
182 Ok(value)
183 } else {
184 Err(error::trailing_bytes())
185 }
186}
187
188#[inline(always)]
190#[expect(unused_variables)]
191pub fn deserialize_with_context<'de, Ctx, T, C: Config>(
192 ctx: Ctx,
193 src: &'de [u8],
194 config: C,
195) -> ReadResult<T>
196where
197 T: SchemaReadContext<'de, C, Ctx, Dst = T>,
198{
199 T::get_with_context(ctx, src)
200}
201
202#[inline(always)]
204#[expect(unused_variables)]
205pub fn deserialize_mut<'de, T, C: Config>(src: &'de mut [u8], config: C) -> ReadResult<T>
206where
207 T: SchemaRead<'de, C, Dst = T>,
208{
209 T::get(src)
210}
211
212#[inline(always)]
214#[expect(unused_variables)]
215pub fn deserialize_from<'de, T, C: Config>(src: impl Reader<'de>, config: C) -> ReadResult<T>
216where
217 T: SchemaReadOwned<C, Dst = T>,
218{
219 T::deserialize_from(src)
220}
221
222pub unsafe trait ZeroCopy<C: ConfigCore>: 'static {
234 #[inline(always)]
236 #[expect(unused_variables)]
237 fn from_bytes<'de>(bytes: &'de [u8], config: C) -> ReadResult<&'de Self>
238 where
239 Self: SchemaRead<'de, C, Dst = Self> + Sized,
240 {
241 <&Self as SchemaRead<'de, C>>::get(bytes)
242 }
243
244 #[inline(always)]
246 #[expect(unused_variables)]
247 fn from_bytes_mut<'de>(bytes: &'de mut [u8], config: C) -> ReadResult<&'de mut Self>
248 where
249 Self: SchemaRead<'de, C, Dst = Self> + Sized,
250 {
251 <&mut Self as SchemaRead<'de, C>>::get(bytes)
252 }
253}