naia_serde/impls/
string.rs1use 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#[cfg(test)]
40mod tests {
41 use crate::{bit_reader::BitReader, bit_writer::BitWriter, serde::Serde};
42
43 #[test]
44 fn read_write() {
45 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 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}