fusio_log/serdes/
bytes.rs1use 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}