byten/
prelude.rs

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}