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 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}