fusio_log/serdes/
num.rs

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}