fusio_log/serdes/
list.rs

1use fusio::{SeqRead, Write};
2
3use super::{Decode, Encode};
4
5impl Decode for Vec<u8> {
6    type Error = fusio::Error;
7
8    async fn decode<R>(reader: &mut R) -> Result<Self, Self::Error>
9    where
10        R: SeqRead,
11    {
12        let len = u32::decode(reader).await?;
13        let (result, buf) = reader
14            .read_exact(vec![0u8; len as usize * size_of::<u8>()])
15            .await;
16        result?;
17
18        Ok(buf)
19    }
20}
21
22impl Encode for Vec<u8> {
23    type Error = fusio::Error;
24
25    async fn encode<W>(&self, writer: &mut W) -> Result<(), Self::Error>
26    where
27        W: Write,
28    {
29        (self.len() as u32).encode(writer).await?;
30        let (result, _) = writer.write_all(self.as_slice()).await;
31        result?;
32
33        Ok(())
34    }
35
36    fn size(&self) -> usize {
37        size_of::<u32>() + size_of::<u8>() * self.len()
38    }
39}
40
41#[cfg(test)]
42mod tests {
43    use std::io::Cursor;
44
45    use tokio::io::AsyncSeekExt;
46
47    use crate::serdes::{Decode, Encode};
48
49    #[tokio::test]
50    async fn test_u8_encode_decode() {
51        let source = b"hello! Tonbo".to_vec();
52
53        let mut bytes = Vec::new();
54        let mut cursor = Cursor::new(&mut bytes);
55
56        source.encode(&mut cursor).await.unwrap();
57
58        cursor.seek(std::io::SeekFrom::Start(0)).await.unwrap();
59        let decoded = Vec::<u8>::decode(&mut cursor).await.unwrap();
60
61        assert_eq!(source, decoded);
62    }
63}