encode/encoders/
slices.rs1use super::InsufficientSpace;
2use crate::BaseEncoder;
3use crate::ByteEncoder;
4
5impl BaseEncoder for &mut [u8] {
6 type Error = InsufficientSpace;
7}
8
9impl ByteEncoder for &mut [u8] {
10 #[inline]
11 fn put_slice(&mut self, slice: &[u8]) -> Result<(), Self::Error> {
12 let (a, b) = core::mem::take(self)
13 .split_at_mut_checked(slice.len())
14 .ok_or(InsufficientSpace)?;
15 a.copy_from_slice(slice);
16 *self = b;
17 Ok(())
18 }
19
20 #[inline]
21 fn put_byte(&mut self, byte: u8) -> Result<(), Self::Error> {
22 self.put_slice(&[byte])
23 }
24}
25
26#[cfg(test)]
27mod test {
28 use crate::Encodable;
29
30 #[test]
31 fn assert_that_encoding_something_into_an_empty_slice_always_fails() {
32 let mut encoder = &mut [0u8; 0] as &mut [u8];
33 let encodable = "hello";
34 assert!(
35 encodable.encode(&mut encoder).is_err(),
36 "Empty arrays should always fail"
37 );
38 }
39
40 #[test]
41 fn assert_that_slices_can_be_used_as_encoders() {
42 const BUF_SIZE: usize = 64;
43 let mut buf = [0u8; BUF_SIZE];
44 let mut remaining_buf = &mut buf as &mut [u8];
45 let encodable = "hello";
46
47 encodable.encode(&mut remaining_buf).unwrap();
48 let bytes_written = BUF_SIZE - remaining_buf.len();
49
50 assert_eq!(bytes_written, 5, "The buffer should contain 5 bytes");
51 assert_eq!(
52 &buf[..bytes_written],
53 b"hello",
54 "The buffer should contain the encoded string"
55 );
56 }
57}