1use alloc::{boxed::Box, vec::Vec};
4
5use crate::{DeserializeBytes, SerializeBytes, U24};
6
7use super::{Deserialize, Error, Serialize, Size};
8
9use core::marker::PhantomData;
10#[cfg(feature = "std")]
11use std::io::{Read, Write};
12
13impl<T: Size> Size for Option<T> {
14 #[inline]
15 fn tls_serialized_len(&self) -> usize {
16 1 + match self {
17 Some(v) => v.tls_serialized_len(),
18 None => 0,
19 }
20 }
21}
22
23impl<T: Size> Size for &Option<T> {
24 #[inline]
25 fn tls_serialized_len(&self) -> usize {
26 (*self).tls_serialized_len()
27 }
28}
29
30impl<T: Serialize> Serialize for Option<T> {
31 #[cfg(feature = "std")]
32 fn tls_serialize<W: Write>(&self, writer: &mut W) -> Result<usize, Error> {
33 match self {
34 Some(e) => {
35 let written = writer.write(&[1])?;
36 debug_assert_eq!(written, 1);
37 e.tls_serialize(writer).map(|l| l + 1)
38 }
39 None => {
40 writer.write_all(&[0])?;
41 Ok(1)
42 }
43 }
44 }
45}
46
47impl<T: SerializeBytes> SerializeBytes for Option<T> {
48 #[inline]
49 fn tls_serialize(&self) -> Result<Vec<u8>, Error> {
50 match self {
51 Some(e) => {
52 let mut out = Vec::with_capacity(e.tls_serialized_len() + 1);
53 out.push(1);
54 out.append(&mut e.tls_serialize()?);
55 Ok(out)
56 }
57 None => Ok(vec![0]),
58 }
59 }
60}
61
62impl<T: Serialize> Serialize for &Option<T> {
63 #[cfg(feature = "std")]
64 fn tls_serialize<W: Write>(&self, writer: &mut W) -> Result<usize, Error> {
65 (*self).tls_serialize(writer)
66 }
67}
68
69impl<T: SerializeBytes> SerializeBytes for &Option<T> {
70 #[inline]
71 fn tls_serialize(&self) -> Result<Vec<u8>, Error> {
72 (*self).tls_serialize()
73 }
74}
75
76impl<T: Deserialize> Deserialize for Option<T> {
77 #[cfg(feature = "std")]
78 #[inline]
79 fn tls_deserialize<R: Read>(bytes: &mut R) -> Result<Self, Error> {
80 let mut some_or_none = [0u8; 1];
81 bytes.read_exact(&mut some_or_none)?;
82 match some_or_none[0] {
83 0 => {
84 Ok(None)
85 },
86 1 => {
87 let element = T::tls_deserialize(bytes)?;
88 Ok(Some(element))
89 },
90 _ => Err(Error::DecodingError(format!("Trying to decode Option<T> with {} for option. It must be 0 for None and 1 for Some.", some_or_none[0])))
91 }
92 }
93}
94
95impl<T: DeserializeBytes> DeserializeBytes for Option<T> {
96 #[inline]
97 fn tls_deserialize_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), Error> {
98 let (some_or_none, remainder) = <u8>::tls_deserialize_bytes(bytes)?;
99 match some_or_none {
100 0 => {
101 Ok((None, remainder))
102 },
103 1 => {
104 let (element, remainder) = T::tls_deserialize_bytes(remainder)?;
105 Ok((Some(element), remainder))
106 },
107 _ => Err(Error::DecodingError(alloc::format!("Trying to decode Option<T> with {} for option. It must be 0 for None and 1 for Some.", some_or_none)))
108 }
109 }
110}
111
112macro_rules! impl_unsigned {
113 ($t:ty, $bytes:literal) => {
114 impl Deserialize for $t {
115 #[cfg(feature = "std")]
116 #[inline]
117 fn tls_deserialize<R: Read>(bytes: &mut R) -> Result<Self, Error> {
118 let mut x = <$t>::default().to_be_bytes();
119 bytes.read_exact(&mut x)?;
120 Ok(<$t>::from_be_bytes(x))
121 }
122 }
123
124 impl DeserializeBytes for $t {
125 #[inline]
126 fn tls_deserialize_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), Error> {
127 let len = core::mem::size_of::<$t>();
128 let out = bytes
129 .get(..len)
130 .ok_or(Error::EndOfStream)?
131 .try_into()
132 .map_err(|_| Error::EndOfStream)?;
133 Ok((
134 <$t>::from_be_bytes(out),
135 &bytes.get(len..).ok_or(Error::EndOfStream)?,
136 ))
137 }
138 }
139
140 impl SerializeBytes for &$t {
141 #[inline]
142 fn tls_serialize(&self) -> Result<Vec<u8>, Error> {
143 Ok(self.to_be_bytes().to_vec())
144 }
145 }
146
147 impl SerializeBytes for $t {
148 #[inline]
149 fn tls_serialize(&self) -> Result<Vec<u8>, Error> {
150 <&Self as SerializeBytes>::tls_serialize(&self)
151 }
152 }
153
154 impl Serialize for $t {
155 #[cfg(feature = "std")]
156 #[inline]
157 fn tls_serialize<W: Write>(&self, writer: &mut W) -> Result<usize, Error> {
158 let written = writer.write(&self.to_be_bytes())?;
159 debug_assert_eq!(written, $bytes);
160 Ok(written)
161 }
162 }
163
164 impl Serialize for &$t {
165 #[cfg(feature = "std")]
166 #[inline]
167 fn tls_serialize<W: Write>(&self, writer: &mut W) -> Result<usize, Error> {
168 <$t as Serialize>::tls_serialize(self, writer)
169 }
170 }
171
172 impl Size for $t {
173 #[inline]
174 fn tls_serialized_len(&self) -> usize {
175 $bytes
176 }
177 }
178
179 impl Size for &$t {
180 #[inline]
181 fn tls_serialized_len(&self) -> usize {
182 (*self).tls_serialized_len()
183 }
184 }
185 };
186}
187
188impl_unsigned!(u8, 1);
189impl_unsigned!(u16, 2);
190impl_unsigned!(U24, 3);
191impl_unsigned!(u32, 4);
192impl_unsigned!(u64, 8);
193
194impl From<core::array::TryFromSliceError> for Error {
195 fn from(_: core::array::TryFromSliceError) -> Self {
196 Self::InvalidInput
197 }
198}
199
200impl<T, U> Deserialize for (T, U)
202where
203 T: Deserialize,
204 U: Deserialize,
205{
206 #[cfg(feature = "std")]
207 #[inline(always)]
208 fn tls_deserialize<R: Read>(bytes: &mut R) -> Result<Self, Error> {
209 Ok((T::tls_deserialize(bytes)?, U::tls_deserialize(bytes)?))
210 }
211}
212
213impl<T, U> DeserializeBytes for (T, U)
214where
215 T: DeserializeBytes,
216 U: DeserializeBytes,
217{
218 #[inline(always)]
219 fn tls_deserialize_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), Error> {
220 let (first_element, remainder) = T::tls_deserialize_bytes(bytes)?;
221 let (second_element, remainder) = U::tls_deserialize_bytes(remainder)?;
222 Ok(((first_element, second_element), remainder))
223 }
224}
225
226impl<T, U> Serialize for (T, U)
227where
228 T: Serialize,
229 U: Serialize,
230{
231 #[cfg(feature = "std")]
232 #[inline(always)]
233 fn tls_serialize<W: Write>(&self, writer: &mut W) -> Result<usize, Error> {
234 let written = self.0.tls_serialize(writer)?;
235 self.1.tls_serialize(writer).map(|l| l + written)
236 }
237}
238
239impl<T, U> Size for (T, U)
240where
241 T: Size,
242 U: Size,
243{
244 #[inline(always)]
245 fn tls_serialized_len(&self) -> usize {
246 self.0.tls_serialized_len() + self.1.tls_serialized_len()
247 }
248}
249
250impl<T, U, V> Deserialize for (T, U, V)
251where
252 T: Deserialize,
253 U: Deserialize,
254 V: Deserialize,
255{
256 #[cfg(feature = "std")]
257 #[inline(always)]
258 fn tls_deserialize<R: Read>(bytes: &mut R) -> Result<Self, Error> {
259 Ok((
260 T::tls_deserialize(bytes)?,
261 U::tls_deserialize(bytes)?,
262 V::tls_deserialize(bytes)?,
263 ))
264 }
265}
266
267impl<T, U, V> DeserializeBytes for (T, U, V)
268where
269 T: DeserializeBytes,
270 U: DeserializeBytes,
271 V: DeserializeBytes,
272{
273 #[inline(always)]
274 fn tls_deserialize_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), Error> {
275 let (first_element, remainder) = T::tls_deserialize_bytes(bytes)?;
276 let (second_element, remainder) = U::tls_deserialize_bytes(remainder)?;
277 let (third_element, remainder) = V::tls_deserialize_bytes(remainder)?;
278 Ok(((first_element, second_element, third_element), remainder))
279 }
280}
281
282impl<T, U, V> Serialize for (T, U, V)
283where
284 T: Serialize,
285 U: Serialize,
286 V: Serialize,
287{
288 #[cfg(feature = "std")]
289 #[inline(always)]
290 fn tls_serialize<W: Write>(&self, writer: &mut W) -> Result<usize, Error> {
291 let mut written = self.0.tls_serialize(writer)?;
292 written += self.1.tls_serialize(writer)?;
293 self.2.tls_serialize(writer).map(|l| l + written)
294 }
295}
296
297impl<T, U, V> Size for (T, U, V)
298where
299 T: Size,
300 U: Size,
301 V: Size,
302{
303 #[inline(always)]
304 fn tls_serialized_len(&self) -> usize {
305 self.0.tls_serialized_len() + self.1.tls_serialized_len() + self.2.tls_serialized_len()
306 }
307}
308
309impl Size for () {
310 #[inline(always)]
311 fn tls_serialized_len(&self) -> usize {
312 0
313 }
314}
315
316impl Deserialize for () {
317 #[cfg(feature = "std")]
318 #[inline(always)]
319 fn tls_deserialize<R: Read>(_: &mut R) -> Result<(), Error> {
320 Ok(())
321 }
322}
323
324impl DeserializeBytes for () {
325 #[inline(always)]
326 fn tls_deserialize_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), Error> {
327 Ok(((), bytes))
328 }
329}
330
331impl Serialize for () {
332 #[cfg(feature = "std")]
333 fn tls_serialize<W: Write>(&self, _: &mut W) -> Result<usize, Error> {
334 Ok(0)
335 }
336}
337
338impl<T> Size for PhantomData<T> {
339 #[inline(always)]
340 fn tls_serialized_len(&self) -> usize {
341 0
342 }
343}
344
345impl<T> Deserialize for PhantomData<T> {
346 #[cfg(feature = "std")]
347 #[inline(always)]
348 fn tls_deserialize<R: Read>(_: &mut R) -> Result<Self, Error> {
349 Ok(PhantomData)
350 }
351}
352
353impl<T> DeserializeBytes for PhantomData<T> {
354 #[inline(always)]
355 fn tls_deserialize_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), Error> {
356 Ok((PhantomData, bytes))
357 }
358}
359
360impl<T> Serialize for PhantomData<T> {
361 #[cfg(feature = "std")]
362 #[inline(always)]
363 fn tls_serialize<W: Write>(&self, _: &mut W) -> Result<usize, Error> {
364 Ok(0)
365 }
366}
367
368impl<T> SerializeBytes for PhantomData<T> {
369 #[inline(always)]
370 fn tls_serialize(&self) -> Result<Vec<u8>, Error> {
371 Ok(vec![])
372 }
373}
374
375impl<T: Size> Size for Box<T> {
376 #[inline(always)]
377 fn tls_serialized_len(&self) -> usize {
378 self.as_ref().tls_serialized_len()
379 }
380}
381
382impl<T: Serialize> Serialize for Box<T> {
383 #[cfg(feature = "std")]
384 #[inline(always)]
385 fn tls_serialize<W: Write>(&self, writer: &mut W) -> Result<usize, Error> {
386 self.as_ref().tls_serialize(writer)
387 }
388}
389
390impl<T: SerializeBytes> SerializeBytes for Box<T> {
391 #[inline(always)]
392 fn tls_serialize(&self) -> Result<Vec<u8>, Error> {
393 self.as_ref().tls_serialize()
394 }
395}
396
397impl<T: Deserialize> Deserialize for Box<T> {
398 #[cfg(feature = "std")]
399 #[inline(always)]
400 fn tls_deserialize<R: Read>(bytes: &mut R) -> Result<Self, Error> {
401 T::tls_deserialize(bytes).map(Box::new)
402 }
403}
404
405impl<T: DeserializeBytes> DeserializeBytes for Box<T> {
406 #[inline(always)]
407 fn tls_deserialize_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), Error> {
408 T::tls_deserialize_bytes(bytes).map(|(v, r)| (Box::new(v), r))
409 }
410}