fusio_log/serdes/
string.rs

1use std::mem::size_of;
2
3use fusio::{SeqRead, Write};
4
5use super::{Decode, Encode};
6
7impl Encode for &str {
8    type Error = fusio::Error;
9
10    async fn encode<W>(&self, writer: &mut W) -> Result<(), Self::Error>
11    where
12        W: Write,
13    {
14        (self.len() as u16).encode(writer).await?;
15        #[cfg(feature = "monoio")]
16        let (result, _) = writer.write_all(self.as_bytes().to_vec()).await;
17        #[cfg(not(feature = "monoio"))]
18        let (result, _) = writer.write_all(self.as_bytes()).await;
19        result?;
20
21        Ok(())
22    }
23
24    fn size(&self) -> usize {
25        size_of::<u16>() + self.len()
26    }
27}
28
29impl Encode for String {
30    type Error = fusio::Error;
31
32    async fn encode<W>(&self, writer: &mut W) -> Result<(), Self::Error>
33    where
34        W: Write,
35    {
36        self.as_str().encode(writer).await
37    }
38
39    fn size(&self) -> usize {
40        self.as_str().size()
41    }
42}
43
44impl Decode for String {
45    type Error = fusio::Error;
46
47    async fn decode<R: SeqRead>(reader: &mut R) -> Result<Self, Self::Error> {
48        let len = u16::decode(reader).await?;
49        let (result, buf) = reader.read_exact(vec![0u8; len as usize]).await;
50        result?;
51
52        Ok(unsafe { String::from_utf8_unchecked(buf.as_slice().to_vec()) })
53    }
54}
55
56#[cfg(test)]
57mod tests {
58    use std::io::Cursor;
59
60    use tokio::io::AsyncSeekExt;
61
62    use crate::serdes::{Decode, Encode};
63
64    #[tokio::test]
65    async fn test_encode_decode() {
66        let source_0 = "Hello! World";
67        let source_1 = "Hello! Tonbo".to_string();
68
69        let mut bytes = Vec::new();
70        let mut cursor = Cursor::new(&mut bytes);
71
72        source_0.encode(&mut cursor).await.unwrap();
73        source_1.encode(&mut cursor).await.unwrap();
74
75        cursor.seek(std::io::SeekFrom::Start(0)).await.unwrap();
76        let decoded_0 = String::decode(&mut cursor).await.unwrap();
77        let decoded_1 = String::decode(&mut cursor).await.unwrap();
78
79        assert_eq!(source_0, decoded_0);
80        assert_eq!(source_1, decoded_1);
81    }
82}