fusio_log/serdes/
boolean.rs

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