encdec_base/encode/
mod.rs1use core::fmt::Debug;
4
5use crate::Error;
6
7mod prefixed;
8pub use prefixed::EncodePrefixed;
9
10mod ext;
11pub use ext::EncodeExt;
12
13pub trait Encode: Debug {
15 type Error: From<Error> + Debug;
17
18 fn encode_len(&self) -> Result<usize, Self::Error>;
20
21 fn encode(&self, buff: &mut [u8]) -> Result<usize, Self::Error>;
23}
24
25#[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
39impl<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
69impl<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
99impl 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#[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#[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}