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