encode/encoders/
slices.rs

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