1use dbutils::error::{IncompleteBuffer, InsufficientBuffer};
2
3use crate::{LengthDelimitedDecoder, LengthDelimitedEncoder};
4
5macro_rules! numbers_impl_length_delimited {
6 ($($ty:ident), +$(,)?) => {
7 paste::paste! {
8 $(
9 impl $crate::LengthDelimitedEncoder for $ty {
10 type Error = InsufficientBuffer;
11
12 fn encoded_len(&self) -> usize {
13 dbutils::leb128::[< encoded_ $ty _varint_len >](*self)
14 }
15
16 fn encoded_length_delimited_len(&self) -> usize {
17 <Self as $crate::LengthDelimitedEncoder>::encoded_len(self)
18 }
19
20 fn encode_length_delimited(&self, buf: &mut [u8]) -> Result<usize, Self::Error> {
21 <Self as $crate::LengthDelimitedEncoder>::encode(self, buf)
22 }
23
24 fn encode(&self, buf: &mut [u8]) -> Result<usize, Self::Error> {
25 dbutils::leb128::Varint::encode(self, buf).map_err(|_| InsufficientBuffer::new())
26 }
27 }
28
29 impl $crate::LengthDelimitedDecoder for $ty {
30 type Error = $crate::DecodeVarintError;
31
32 fn decode(src: &[u8]) -> Result<(usize, Self), Self::Error>
33 where
34 Self: Sized,
35 {
36 dbutils::leb128::[< decode_ $ty _varint >](src)
37 }
38
39 fn decode_length_delimited(src: &[u8]) -> Result<(usize, Self), Self::Error>
40 where
41 Self: Sized,
42 {
43 <Self as $crate::LengthDelimitedDecoder>::decode(src)
44 }
45 }
46 )*
47 }
48 };
49 (@fixed $($ty:ident), +$(,)?) => {
50 paste::paste! {
51 $(
52 impl $crate::LengthDelimitedEncoder for $ty {
53 type Error = InsufficientBuffer;
54
55 fn encoded_len(&self) -> usize {
56 core::mem::size_of::<$ty>()
57 }
58
59 fn encoded_length_delimited_len(&self) -> usize {
60 <Self as $crate::LengthDelimitedEncoder>::encoded_len(self)
61 }
62
63 fn encode_length_delimited(&self, buf: &mut [u8]) -> Result<usize, Self::Error> {
64 <Self as $crate::LengthDelimitedEncoder>::encode(self, buf)
65 }
66
67 fn encode(&self, buf: &mut [u8]) -> Result<usize, Self::Error> {
68 const SIZE: usize = core::mem::size_of::<$ty>();
69
70 if buf.len() < SIZE {
71 return Err(InsufficientBuffer::with_information(SIZE as u64, buf.len() as u64));
72 }
73
74 buf[..SIZE].copy_from_slice(&self.to_le_bytes());
75 Ok(SIZE)
76 }
77 }
78
79 impl $crate::LengthDelimitedDecoder for $ty {
80 type Error = IncompleteBuffer;
81
82 fn decode(src: &[u8]) -> Result<(usize, Self), Self::Error>
83 where
84 Self: Sized,
85 {
86 const SIZE: usize = core::mem::size_of::<$ty>();
87
88 if src.len() < SIZE {
89 return Err(IncompleteBuffer::with_information(SIZE as u64, src.len() as u64));
90 }
91
92 let mut bytes = [0u8; SIZE];
93 bytes.copy_from_slice(&src[..SIZE]);
94 Ok((SIZE, Self::from_le_bytes(bytes)))
95 }
96
97 fn decode_length_delimited(src: &[u8]) -> Result<(usize, Self), Self::Error>
98 where
99 Self: Sized,
100 {
101 <Self as $crate::LengthDelimitedDecoder>::decode(src)
102 }
103 }
104 )*
105 }
106 }
107}
108
109numbers_impl_length_delimited!(u16, i16, u32, i32, u64, i64, u128, i128,);
110
111numbers_impl_length_delimited!(@fixed f32, f64,);
112
113impl_length_delimited!(i8 as u8,);
114
115impl LengthDelimitedEncoder for u8 {
116 type Error = InsufficientBuffer;
117
118 fn encoded_len(&self) -> usize {
119 1
120 }
121
122 fn encoded_length_delimited_len(&self) -> usize {
123 self.encoded_len()
124 }
125
126 fn encode_length_delimited(&self, buf: &mut [u8]) -> Result<usize, Self::Error> {
127 self.encode(buf)
128 }
129
130 fn encode(&self, buf: &mut [u8]) -> Result<usize, Self::Error> {
131 if buf.is_empty() {
132 return Err(InsufficientBuffer::with_information(1, 0));
133 }
134
135 buf[0] = *self;
136 Ok(1)
137 }
138}
139
140impl LengthDelimitedDecoder for u8 {
141 type Error = IncompleteBuffer;
142
143 fn decode(src: &[u8]) -> Result<(usize, Self), Self::Error>
144 where
145 Self: Sized,
146 {
147 if src.is_empty() {
148 Err(IncompleteBuffer::with_information(1, 0))
149 } else {
150 Ok((1, src[0]))
151 }
152 }
153
154 fn decode_length_delimited(src: &[u8]) -> Result<(usize, Self), Self::Error>
155 where
156 Self: Sized,
157 {
158 Self::decode(src)
159 }
160}
161
162impl_length_delimited!(@encoder bool as u8,);
163
164impl LengthDelimitedDecoder for bool {
165 type Error = IncompleteBuffer;
166
167 fn decode(src: &[u8]) -> Result<(usize, Self), Self::Error>
168 where
169 Self: Sized,
170 {
171 if src.is_empty() {
172 Err(IncompleteBuffer::with_information(1, 0))
173 } else {
174 Ok((1, src[0] != 0))
175 }
176 }
177
178 fn decode_length_delimited(src: &[u8]) -> Result<(usize, Self), Self::Error>
179 where
180 Self: Sized,
181 {
182 Self::decode(src)
183 }
184}
185
186#[derive(Debug, Clone, PartialEq, Eq, thiserror::Error)]
188pub enum DecodeCharError {
189 #[error(transparent)]
191 IncompleteBuffer(#[from] IncompleteBuffer),
192 #[error("invalid character value")]
194 InvalidChar,
195}
196
197impl From<dbutils::leb128::DecodeVarintError> for DecodeCharError {
198 fn from(e: dbutils::leb128::DecodeVarintError) -> Self {
199 match e {
200 dbutils::leb128::DecodeVarintError::Underflow => {
201 DecodeCharError::IncompleteBuffer(IncompleteBuffer::new())
202 }
203 dbutils::leb128::DecodeVarintError::Overflow => DecodeCharError::InvalidChar,
204 }
205 }
206}
207
208impl_length_delimited!(@encoder char as u32,);
209
210impl LengthDelimitedDecoder for char {
211 type Error = DecodeCharError;
212
213 fn decode(src: &[u8]) -> Result<(usize, Self), Self::Error>
214 where
215 Self: Sized,
216 {
217 let (size, code) = <u32 as LengthDelimitedDecoder>::decode(src)?;
218 let c = core::char::from_u32(code).ok_or(DecodeCharError::InvalidChar)?;
219 Ok((size, c))
220 }
221
222 fn decode_length_delimited(src: &[u8]) -> Result<(usize, Self), Self::Error>
223 where
224 Self: Sized,
225 {
226 Self::decode(src)
227 }
228}
229
230#[cfg(test)]
231mod tests {
232 use super::*;
233
234 #[test]
235 fn test_u8_encode_decode() {
236 let value: u8 = 42;
237 let mut buffer = [0u8; 1];
238
239 let encoded_size = value.encode(&mut buffer).unwrap();
241 assert_eq!(encoded_size, 1);
242 assert_eq!(buffer[0], 42);
243
244 let (decoded_size, decoded_value) = u8::decode(&buffer).unwrap();
246 assert_eq!(decoded_size, 1);
247 assert_eq!(decoded_value, 42);
248 }
249
250 #[test]
251 fn test_u16_encode_decode() {
252 let value: u16 = 12345;
253 let mut buffer = [0u8; 3]; let encoded_size = value.encode(&mut buffer).unwrap();
257 assert!(encoded_size <= 3);
258
259 let (decoded_size, decoded_value) = u16::decode(&buffer).unwrap();
261 assert_eq!(decoded_size, encoded_size);
262 assert_eq!(decoded_value, 12345);
263 }
264
265 #[test]
266 fn test_bool_encode_decode() {
267 let value = true;
268 let mut buffer = [0u8; 1];
269
270 let encoded_size = value.encode(&mut buffer).unwrap();
272 assert_eq!(encoded_size, 1);
273 assert_eq!(buffer[0], 1);
274
275 let (decoded_size, decoded_value) = bool::decode(&buffer).unwrap();
277 assert_eq!(decoded_size, 1);
278 assert!(decoded_value);
279 }
280
281 #[test]
282 fn test_char_encode_decode() {
283 let value = '🦀';
284 let mut buffer = [0u8; 4]; let written = value.encode(&mut buffer).unwrap();
287 let (read, decoded) = char::decode(&buffer[..written]).unwrap();
288 assert_eq!(value, decoded);
289 assert_eq!(written, read);
290 }
291
292 #[test]
293 fn test_u8_encode_insufficient_buffer() {
294 let value: u8 = 42;
295 let mut buffer = [0u8; 0]; let result = value.encode(&mut buffer);
299 assert!(matches!(result, Err(InsufficientBuffer { .. })));
300 }
301
302 #[test]
303 fn test_u8_decode_incomplete_buffer() {
304 let buffer = []; let result = u8::decode(&buffer);
308 assert!(matches!(result, Err(IncompleteBuffer { .. })));
309 }
310
311 #[test]
312 fn test_char_decode_invalid_char() {
313 let mut buffer = [0u8; 128];
314
315 let invalid_char_value: u32 = 0x110000; let written = invalid_char_value.encode(&mut buffer).unwrap();
318
319 assert!(matches!(
320 char::decode(&buffer[..written]),
321 Err(DecodeCharError::InvalidChar)
322 ));
323 }
324
325 #[test]
326 fn test_u16_decode_incomplete_buffer() {
327 let buffer = [0x80]; let result = u16::decode(&buffer);
331 assert!(matches!(result, Err(crate::DecodeVarintError::Underflow)));
332 }
333
334 #[test]
335 fn test_bool_decode_incomplete_buffer() {
336 let buffer = []; let result = bool::decode(&buffer);
340 assert!(matches!(result, Err(IncompleteBuffer { .. })));
341 }
342}