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