encdec_base/encode/
mod.rs

1//! [`Encode`] trait implementation
2
3use core::fmt::Debug;
4
5use crate::Error;
6
7mod prefixed;
8pub use prefixed::EncodePrefixed;
9
10mod ext;
11pub use ext::EncodeExt;
12
13/// Encode trait implemented for binary encodable objects
14pub trait Encode: Debug {
15    /// Error type returned on parse error
16    type Error: From<Error> + Debug;
17
18    /// Calculate expected encoded length for an object
19    fn encode_len(&self) -> Result<usize, Self::Error>;
20
21    /// Encode method writes object data to the provided writer
22    fn encode(&self, buff: &mut [u8]) -> Result<usize, Self::Error>;
23}
24
25/// Blanket encode for references to encodable types
26#[cfg(nope)]
27impl<T: Encode> Encode for &T {
28    type Error = <T as Encode>::Error;
29
30    fn encode_len(&self) -> Result<usize, Self::Error> {
31        <T as Encode>::encode_len(self)
32    }
33
34    fn encode(&self, buff: &mut [u8]) -> Result<usize, Self::Error> {
35        <T as Encode>::encode(self, buff)
36    }
37}
38
39/// Blanket [`Encode`] impl for slices of encodable types
40impl<T> Encode for &[T]
41where
42    T: Encode,
43    <T as Encode>::Error: From<Error> + Debug,
44{
45    type Error = <T as Encode>::Error;
46
47    fn encode_len(&self) -> Result<usize, Self::Error> {
48        let mut index = 0;
49        for i in 0..self.len() {
50            index += self[i].encode_len()?;
51        }
52        Ok(index)
53    }
54
55    fn encode(&self, buff: &mut [u8]) -> Result<usize, Self::Error> {
56        if buff.len() < self.encode_len()? {
57            return Err(Error::Length.into());
58        }
59
60        let mut index = 0;
61        for i in 0..self.len() {
62            index += self[i].encode(&mut buff[index..])?
63        }
64
65        Ok(index)
66    }
67}
68
69/// Blanket [`Encode`] impl for arrays of encodable types
70impl<T, const N: usize> Encode for [T; N]
71where
72    T: Encode,
73    <T as Encode>::Error: From<Error> + Debug,
74{
75    type Error = <T as Encode>::Error;
76
77    fn encode_len(&self) -> Result<usize, Self::Error> {
78        let mut index = 0;
79        for i in 0..N {
80            index += self[i].encode_len()?;
81        }
82        Ok(index)
83    }
84
85    fn encode(&self, buff: &mut [u8]) -> Result<usize, Self::Error> {
86        if buff.len() < self.encode_len()? {
87            return Err(Error::Length.into());
88        }
89
90        let mut index = 0;
91        for i in 0..N {
92            index += self[i].encode(&mut buff[index..])?
93        }
94
95        Ok(index)
96    }
97}
98
99/// [`Encode`] implementation for [`str`]
100impl Encode for &str {
101    type Error = Error;
102
103    fn encode_len(&self) -> Result<usize, Self::Error> {
104        Ok(self.as_bytes().len())
105    }
106
107    fn encode(&self, buff: &mut [u8]) -> Result<usize, Self::Error> {
108        let d = self.as_bytes();
109        if buff.len() < d.encode_len()? {
110            return Err(Error::Length.into());
111        }
112
113        buff[..d.len()].copy_from_slice(d);
114
115        Ok(d.len())
116    }
117}
118
119/// [`Encode`] implementation for std/alloc [`alloc::vec::Vec`] containing encodable types
120#[cfg(feature = "alloc")]
121impl<T> Encode for alloc::vec::Vec<T>
122where
123    T: Encode,
124    <T as Encode>::Error: From<Error> + Debug,
125{
126    type Error = <T as Encode>::Error;
127
128    #[inline]
129    fn encode_len(&self) -> Result<usize, Self::Error> {
130        let b: &[T] = self.as_ref();
131        b.encode_len()
132    }
133
134    #[inline]
135    fn encode(&self, buff: &mut [u8]) -> Result<usize, Self::Error> {
136        let b: &[T] = self.as_ref();
137        b.encode(buff)
138    }
139}
140
141/// [`Encode`] implementation for heapless [`heapless::Vec`] containing encodable types
142#[cfg(feature = "heapless")]
143impl<T, const N: usize> Encode for heapless::Vec<T, N>
144where
145    T: Encode,
146    <T as Encode>::Error: From<Error> + Debug,
147{
148    type Error = <T as Encode>::Error;
149
150    #[inline]
151    fn encode_len(&self) -> Result<usize, Self::Error> {
152        let b: &[T] = self.as_ref();
153        b.encode_len()
154    }
155
156    #[inline]
157    fn encode(&self, buff: &mut [u8]) -> Result<usize, Self::Error> {
158        let b: &[T] = self.as_ref();
159        b.encode(buff)
160    }
161}