fusio_log/serdes/
boolean.rs

1use std::mem::size_of;
2
3use fusio::{SeqRead, Write};
4
5use crate::serdes::{Decode, Encode};
6
7impl Encode for bool {
8    type Error = fusio::Error;
9
10    async fn encode<W: Write>(&self, writer: &mut W) -> Result<(), Self::Error> {
11        if *self { 1u8 } else { 0u8 }.encode(writer).await
12    }
13
14    fn size(&self) -> usize {
15        size_of::<u8>()
16    }
17}
18
19impl Decode for bool {
20    type Error = fusio::Error;
21
22    async fn decode<R: SeqRead>(reader: &mut R) -> Result<Self, Self::Error> {
23        Ok(u8::decode(reader).await? == 1u8)
24    }
25}
26
27#[cfg(test)]
28mod tests {
29    use std::io::Cursor;
30
31    use tokio::io::AsyncSeekExt;
32
33    use crate::serdes::{Decode, Encode};
34
35    #[tokio::test]
36    async fn test_encode_decode() {
37        let source_0 = true;
38        let source_1 = false;
39        let source_2 = true;
40
41        let mut bytes = Vec::new();
42        let mut cursor = Cursor::new(&mut bytes);
43
44        source_0.encode(&mut cursor).await.unwrap();
45        source_1.encode(&mut cursor).await.unwrap();
46        source_2.encode(&mut cursor).await.unwrap();
47
48        cursor.seek(std::io::SeekFrom::Start(0)).await.unwrap();
49
50        let decoded_0 = bool::decode(&mut cursor).await.unwrap();
51        let decoded_1 = bool::decode(&mut cursor).await.unwrap();
52        let decoded_2 = bool::decode(&mut cursor).await.unwrap();
53
54        assert_eq!(source_0, decoded_0);
55        assert_eq!(source_1, decoded_1);
56        assert_eq!(source_2, decoded_2);
57    }
58}