Skip to main content

sakka/encoding/
collection.rs

1use crate::{Decode, Encode, ReadCollection, Reader, WriteCollection, Writer};
2
3impl<Ctx, T, const N: usize> Encode<Ctx> for [T; N]
4where
5    T: Encode<Ctx>,
6{
7    type Error = T::Error;
8
9    #[inline]
10    fn encode(&self, writer: &mut Writer<Ctx>) -> Result<(), Self::Error> {
11        writer.write_slice(self)
12    }
13}
14
15impl<Ctx, T, const N: usize> Decode<Ctx> for [T; N]
16where
17    T: Decode<Ctx>,
18{
19    type Error = T::Error;
20
21    #[inline]
22    fn decode(reader: &mut Reader<'_, Ctx>) -> Result<Self, Self::Error> {
23        reader.read_array()
24    }
25}
26
27#[cfg(test)]
28mod tests {
29    use super::*;
30    use crate::Endian;
31
32    #[test]
33    fn encode_array_of_primitives() {
34        let array: [u32; 3] = [0x1234_5678, 0xABCD_EF00, 0x0011_2233];
35        let mut writer = Writer::new(Endian::Little, ());
36        array.encode(&mut writer).unwrap();
37
38        let bytes = writer.finish();
39        // 3 * 4 bytes = 12 bytes
40        assert_eq!(bytes.len(), 12);
41    }
42
43    #[test]
44    fn decode_array_of_primitives() {
45        let data: [u8; 12] = [
46            0x78, 0x56, 0x34, 0x12, // 0x1234_5678 (little endian)
47            0x00, 0xEF, 0xCD, 0xAB, // 0xABCD_EF00 (little endian)
48            0x33, 0x22, 0x11, 0x00, // 0x0011_2233 (little endian)
49        ];
50
51        let mut reader = Reader::new(&data, Endian::Little, ());
52        let array: [u32; 3] = reader.read_array().unwrap();
53
54        assert_eq!(array, [0x1234_5678, 0xABCD_EF00, 0x0011_2233]);
55    }
56
57    #[test]
58    fn roundtrip_array_of_primitives() {
59        let original: [u16; 5] = [0x1234, 0x5678, 0xABCD, 0xEF00, 0x0011];
60
61        let mut writer = Writer::new(Endian::Big, ());
62        original.encode(&mut writer).unwrap();
63        let bytes = writer.finish();
64
65        let mut reader = Reader::new(&bytes, Endian::Big, ());
66        let decoded: [u16; 5] = reader.read_array().unwrap();
67
68        assert_eq!(decoded, original);
69    }
70
71    #[test]
72    fn encode_array_of_u8() {
73        let array: [u8; 4] = [0x12, 0x34, 0x56, 0x78];
74        let mut writer = Writer::new(Endian::Little, ());
75        array.encode(&mut writer).unwrap();
76
77        let bytes = writer.finish();
78        assert_eq!(bytes, &[0x12, 0x34, 0x56, 0x78]);
79    }
80
81    #[test]
82    fn decode_array_of_u8() {
83        let data = [0xAA, 0xBB, 0xCC, 0xDD, 0xEE];
84
85        let mut reader = Reader::new(&data, Endian::Little, ());
86        let array: [u8; 5] = reader.read_array().unwrap();
87
88        assert_eq!(array, [0xAA, 0xBB, 0xCC, 0xDD, 0xEE]);
89    }
90
91    #[test]
92    fn roundtrip_array_of_u8() {
93        let original: [u8; 3] = [0x11, 0x22, 0x33];
94
95        let mut writer = Writer::new(Endian::Little, ());
96        original.encode(&mut writer).unwrap();
97        let bytes = writer.finish();
98
99        let mut reader = Reader::new(&bytes, Endian::Little, ());
100        let decoded: [u8; 3] = reader.read_array().unwrap();
101
102        assert_eq!(decoded, original);
103    }
104}