encode/encoders/
slices.rs1use 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}