fusio_log/serdes/
bytes.rs

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