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