length_delimited/
primitives.rs

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/// Error when decoding a character
187#[derive(Debug, Clone, PartialEq, Eq, thiserror::Error)]
188pub enum DecodeCharError {
189  /// Incomplete buffer
190  #[error(transparent)]
191  IncompleteBuffer(#[from] IncompleteBuffer),
192  /// Invalid character value
193  #[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    // Test encoding
240    let encoded_size = value.encode(&mut buffer).unwrap();
241    assert_eq!(encoded_size, 1);
242    assert_eq!(buffer[0], 42);
243
244    // Test decoding
245    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]; // u16 can take up to 3 bytes in LEB128
254
255    // Test encoding
256    let encoded_size = value.encode(&mut buffer).unwrap();
257    assert!(encoded_size <= 3);
258
259    // Test decoding
260    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    // Test encoding
271    let encoded_size = value.encode(&mut buffer).unwrap();
272    assert_eq!(encoded_size, 1);
273    assert_eq!(buffer[0], 1);
274
275    // Test decoding
276    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]; // char is encoded as u32
285
286    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]; // Empty buffer
296
297    // Test encoding with insufficient buffer
298    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 = []; // Empty buffer
305
306    // Test decoding with incomplete buffer
307    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    // Encode an invalid Unicode scalar value
316    let invalid_char_value: u32 = 0x110000; // First value outside valid Unicode range
317    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]; // Incomplete LEB128 encoding
328
329    // Test decoding with incomplete buffer
330    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 = []; // Empty buffer
337
338    // Test decoding with incomplete buffer
339    let result = bool::decode(&buffer);
340    assert!(matches!(result, Err(IncompleteBuffer { .. })));
341  }
342}