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