encode/encodables/
slices.rs

1use core::ffi::CStr;
2
3use crate::ByteEncoder;
4use crate::Encodable;
5use crate::StrEncoder;
6
7impl<E> Encodable<E> for [u8]
8where
9    E: ByteEncoder,
10{
11    type Error = E::Error;
12
13    #[inline]
14    fn encode(&self, encoder: &mut E) -> Result<(), Self::Error> {
15        encoder.put_slice(self)
16    }
17}
18
19impl<const SIZE: usize, E> Encodable<E> for [u8; SIZE]
20where
21    E: ByteEncoder,
22{
23    type Error = E::Error;
24
25    #[inline]
26    fn encode(&self, encoder: &mut E) -> Result<(), Self::Error> {
27        (self as &[u8]).encode(encoder)
28    }
29}
30
31impl<E> Encodable<E> for str
32where
33    E: StrEncoder,
34{
35    type Error = E::Error;
36
37    #[inline]
38    fn encode(&self, encoder: &mut E) -> Result<(), Self::Error> {
39        encoder.put_str(self)
40    }
41}
42
43impl<E> Encodable<E> for CStr
44where
45    E: ByteEncoder,
46{
47    type Error = E::Error;
48
49    #[inline]
50    fn encode(&self, encoder: &mut E) -> Result<(), Self::Error> {
51        self.to_bytes_with_nul().encode(encoder)
52    }
53}
54
55#[cfg(test)]
56mod tests {
57    use super::*;
58
59    const BUF_SIZE: usize = 64;
60
61    #[test]
62    fn assert_that_arrays_can_be_encoded() {
63        let expected = b"\x01\x02\x03";
64        let encodable: [u8; 3] = [1, 2, 3];
65
66        let mut buf = [0u8; BUF_SIZE];
67        let mut encoder = &mut buf as &mut [u8];
68        encodable.encode(&mut encoder).unwrap();
69        let written = BUF_SIZE - encoder.len();
70        let result = &buf[..written];
71
72        assert_eq!(expected, result);
73    }
74
75    #[test]
76    fn assert_that_slices_can_be_encoded() {
77        let expected = b"\x01\x02\x03";
78        let encodable: &[u8] = &[1, 2, 3];
79
80        let mut buf = [0u8; BUF_SIZE];
81        let mut encoder = &mut buf as &mut [u8];
82        encodable.encode(&mut encoder).unwrap();
83        let written = BUF_SIZE - encoder.len();
84        let result = &buf[..written];
85
86        assert_eq!(expected, result);
87    }
88
89    #[test]
90    fn assert_that_strs_can_be_encoded() {
91        let expected = b"Hello world!";
92        let encodable = "Hello world!";
93
94        let mut buf = [0u8; BUF_SIZE];
95        let mut encoder = &mut buf as &mut [u8];
96        encodable.encode(&mut encoder).unwrap();
97        let written = BUF_SIZE - encoder.len();
98        let result = &buf[..written];
99
100        assert_eq!(expected, result);
101    }
102
103    #[test]
104    fn assert_that_cstrs_can_be_encoded() {
105        let expected = b"Hello world!\0";
106        let encodable = c"Hello world!";
107
108        let mut buf = [0u8; BUF_SIZE];
109        let mut encoder = &mut buf as &mut [u8];
110        encodable.encode(&mut encoder).unwrap();
111        let written = BUF_SIZE - encoder.len();
112        let result = &buf[..written];
113
114        assert_eq!(expected, result);
115    }
116}