1use crate::{Decoder, DefaultCodec, Encoder, Measurer, error::DecodeError, error::EncodeError};
2#[cfg(feature = "alloc")]
3use alloc::{vec, vec::Vec};
4
5pub trait DecodeDefault<'encoded>: Sized {
6 fn decode(
7 encoded: &'encoded [u8],
8 offset: &mut usize,
9 ) -> Result<Self, crate::error::DecodeError>;
10}
11
12impl<'encoded, 'decoded, T> DecodeDefault<'encoded> for T
13where
14 T: DefaultCodec + 'decoded,
15 T::Codec: Decoder<'encoded, 'decoded, Decoded = T>,
16{
17 fn decode(encoded: &'encoded [u8], offset: &mut usize) -> Result<Self, DecodeError> {
18 let codec = T::default_codec();
19 codec.decode(encoded, offset)
20 }
21}
22
23pub trait EncodeDefault {
24 fn encode(&self, encoded: &mut [u8], offset: &mut usize) -> Result<(), EncodeError>;
25}
26
27impl<T, Codec> EncodeDefault for T
28where
29 T: DefaultCodec<Codec = Codec> + ?Sized,
30 Codec: Encoder<Decoded = T>,
31{
32 fn encode(&self, encoded: &mut [u8], offset: &mut usize) -> Result<(), EncodeError> {
33 let codec = T::default_codec();
34 codec.encode(self, encoded, offset)
35 }
36}
37
38pub trait EncodeToVec {
39 #[cfg(feature = "alloc")]
40 fn encode_to_vec(&self) -> Result<Vec<u8>, EncodeError>;
41
42 fn encode_to_heapless_vec<const N: usize>(&self) -> Result<heapless::Vec<u8, N>, EncodeError>;
43}
44
45impl<T, Codec> EncodeToVec for T
46where
47 T: DefaultCodec<Codec = Codec> + ?Sized,
48 Codec: Encoder<Decoded = T> + Measurer<Decoded = T>,
49{
50 #[cfg(feature = "alloc")]
51 fn encode_to_vec(&self) -> Result<Vec<u8>, EncodeError> {
52 let codec = Self::default_codec();
53 EncoderToVec::encode_to_vec(&codec, self)
54 }
55
56 fn encode_to_heapless_vec<const N: usize>(&self) -> Result<heapless::Vec<u8, N>, EncodeError> {
57 let codec = Self::default_codec();
58 EncoderToVec::encode_to_heapless_vec(&codec, self)
59 }
60}
61
62pub trait EncoderToVec {
63 type Decoded: ?Sized;
64
65 #[cfg(feature = "alloc")]
66 fn encode_to_vec(&self, decoded: &Self::Decoded) -> Result<Vec<u8>, EncodeError>;
67
68 fn encode_to_heapless_vec<const N: usize>(
69 &self,
70 decoded: &Self::Decoded,
71 ) -> Result<heapless::Vec<u8, N>, EncodeError>;
72}
73
74impl<Decoded: ?Sized, C: Encoder<Decoded = Decoded> + Measurer<Decoded = Decoded>> EncoderToVec
75 for C
76{
77 type Decoded = Decoded;
78
79 #[cfg(feature = "alloc")]
80 fn encode_to_vec(&self, decoded: &Self::Decoded) -> Result<Vec<u8>, crate::error::EncodeError> {
81 let size = self.measure(decoded)?;
82 let mut vec = vec![0u8; size];
83 let mut offset = 0;
84 self.encode(decoded, &mut vec, &mut offset)?;
85 Ok(vec)
86 }
87
88 fn encode_to_heapless_vec<const N: usize>(
89 &self,
90 decoded: &Self::Decoded,
91 ) -> Result<heapless::Vec<u8, N>, crate::error::EncodeError> {
92 let size = self.measure(decoded)?;
93 if size > N {
94 return Err(crate::error::EncodeError::BufferTooSmall);
95 }
96 let mut vec = heapless::Vec::<u8, N>::new();
97 vec.resize_default(size)
98 .map_err(|_| crate::error::EncodeError::BufferTooSmall)?;
99 let mut offset = 0;
100 self.encode(decoded, &mut vec, &mut offset)?;
101 Ok(vec)
102 }
103}