naia_serde/impls/
string.rs

1use crate::{
2    bit_reader::BitReader, bit_writer::BitWrite, error::SerdeErr, serde::Serde,
3    UnsignedVariableInteger,
4};
5
6impl Serde for String {
7    fn ser(&self, writer: &mut dyn BitWrite) {
8        let length = UnsignedVariableInteger::<9>::new(self.len() as u64);
9        length.ser(writer);
10        let bytes = self.as_bytes();
11        for byte in bytes {
12            writer.write_byte(*byte);
13        }
14    }
15
16    fn de(reader: &mut BitReader) -> Result<Self, SerdeErr> {
17        let length_int = UnsignedVariableInteger::<9>::de(reader)?;
18        let length_usize = length_int.get() as usize;
19        let mut bytes: Vec<u8> = Vec::with_capacity(length_usize);
20        for _ in 0..length_usize {
21            bytes.push(reader.read_byte()?);
22        }
23
24        let result = String::from_utf8_lossy(&bytes).into_owned();
25        Ok(result)
26    }
27
28    fn bit_length(&self) -> u32 {
29        let mut output = 0;
30        let length = UnsignedVariableInteger::<9>::new(self.len() as u64);
31        output += length.bit_length();
32        output += (self.len() as u32) * 8;
33        output
34    }
35}
36
37// Tests
38
39#[cfg(test)]
40mod tests {
41    use crate::{bit_reader::BitReader, bit_writer::BitWriter, serde::Serde};
42
43    #[test]
44    fn read_write() {
45        // Write
46        let mut writer = BitWriter::new();
47
48        let in_1 = "Hello world!".to_string();
49        let in_2 = "This is a string.".to_string();
50
51        in_1.ser(&mut writer);
52        in_2.ser(&mut writer);
53
54        let buffer = writer.to_bytes();
55
56        // Read
57        let mut reader = BitReader::new(&buffer);
58
59        let out_1: String = Serde::de(&mut reader).unwrap();
60        let out_2: String = Serde::de(&mut reader).unwrap();
61
62        assert_eq!(in_1, out_1);
63        assert_eq!(in_2, out_2);
64    }
65}