fusio_log/serdes/
bytes.rs

1use bytes::Bytes;
2use fusio::{Error, IoBuf, SeqRead, Write};
3
4use crate::serdes::{Decode, Encode};
5
6impl Encode for &[u8] {
7    async fn encode<W: Write>(&self, writer: &mut W) -> Result<(), Error> {
8        (self.len() as u32).encode(writer).await?;
9        #[cfg(feature = "monoio")]
10        let (result, _) = writer.write_all(self.to_vec()).await;
11        #[cfg(not(feature = "monoio"))]
12        let (result, _) = writer.write_all(*self).await;
13        result?;
14
15        Ok(())
16    }
17
18    fn size(&self) -> usize {
19        self.len()
20    }
21}
22
23impl Encode for Bytes {
24    async fn encode<W: Write>(&self, writer: &mut W) -> Result<(), Error> {
25        (self.len() as u32).encode(writer).await?;
26        #[cfg(feature = "monoio")]
27        let (result, _) = writer.write_all(self.as_bytes()).await;
28        #[cfg(not(feature = "monoio"))]
29        let (result, _) = writer.write_all(self.as_slice()).await;
30        result?;
31
32        Ok(())
33    }
34
35    fn size(&self) -> usize {
36        self.len()
37    }
38}
39
40impl Decode for Bytes {
41    async fn decode<R: SeqRead>(reader: &mut R) -> Result<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}