encode/encoders/
slices.rs

1use 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}