1use std::mem::size_of;
2
3use fusio::{SeqRead, Write};
4
5use super::{Decode, Encode};
6
7#[macro_export]
8macro_rules! implement_encode_decode {
9 ($struct_name:ident) => {
10 impl Encode for $struct_name {
11 type Error = fusio::Error;
12
13 async fn encode<W: Write>(&self, writer: &mut W) -> Result<(), Self::Error> {
14 let (result, _) = writer.write_all(&self.to_le_bytes()[..]).await;
15 result?;
16
17 Ok(())
18 }
19
20 fn size(&self) -> usize {
21 size_of::<Self>()
22 }
23 }
24
25 impl Decode for $struct_name {
26 type Error = fusio::Error;
27
28 async fn decode<R: SeqRead>(reader: &mut R) -> Result<Self, Self::Error> {
29 let mut bytes = [0u8; size_of::<Self>()];
30 let (result, _) = reader.read_exact(&mut bytes[..]).await;
31 result?;
32
33 Ok(Self::from_le_bytes(bytes))
34 }
35 }
36 };
37}
38
39implement_encode_decode!(i8);
40implement_encode_decode!(i16);
41implement_encode_decode!(i32);
42implement_encode_decode!(i64);
43implement_encode_decode!(u8);
44implement_encode_decode!(u16);
45implement_encode_decode!(u32);
46implement_encode_decode!(u64);
47
48#[cfg(test)]
49mod tests {
50 use std::io::Cursor;
51
52 use tokio::io::AsyncSeekExt;
53
54 use crate::serdes::{Decode, Encode};
55
56 #[tokio::test]
57 async fn test_encode_decode() {
58 let source_0 = 8u8;
59 let source_1 = 16u16;
60 let source_2 = 32u32;
61 let source_3 = 64u64;
62 let source_4 = 8i8;
63 let source_5 = 16i16;
64 let source_6 = 32i32;
65 let source_7 = 64i64;
66
67 let mut bytes = Vec::new();
68 let mut cursor = Cursor::new(&mut bytes);
69
70 source_0.encode(&mut cursor).await.unwrap();
71 source_1.encode(&mut cursor).await.unwrap();
72 source_2.encode(&mut cursor).await.unwrap();
73 source_3.encode(&mut cursor).await.unwrap();
74 source_4.encode(&mut cursor).await.unwrap();
75 source_5.encode(&mut cursor).await.unwrap();
76 source_6.encode(&mut cursor).await.unwrap();
77 source_7.encode(&mut cursor).await.unwrap();
78
79 cursor.seek(std::io::SeekFrom::Start(0)).await.unwrap();
80 let decoded_0 = u8::decode(&mut cursor).await.unwrap();
81 let decoded_1 = u16::decode(&mut cursor).await.unwrap();
82 let decoded_2 = u32::decode(&mut cursor).await.unwrap();
83 let decoded_3 = u64::decode(&mut cursor).await.unwrap();
84 let decoded_4 = i8::decode(&mut cursor).await.unwrap();
85 let decoded_5 = i16::decode(&mut cursor).await.unwrap();
86 let decoded_6 = i32::decode(&mut cursor).await.unwrap();
87 let decoded_7 = i64::decode(&mut cursor).await.unwrap();
88
89 assert_eq!(source_0, decoded_0);
90 assert_eq!(source_1, decoded_1);
91 assert_eq!(source_2, decoded_2);
92 assert_eq!(source_3, decoded_3);
93 assert_eq!(source_4, decoded_4);
94 assert_eq!(source_5, decoded_5);
95 assert_eq!(source_6, decoded_6);
96 assert_eq!(source_7, decoded_7);
97 }
98}