sakka/encoding/
collection.rs1use 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 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, 0x00, 0xEF, 0xCD, 0xAB, 0x33, 0x22, 0x11, 0x00, ];
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}