bytes_kman/std/
string.rs

1use crate::{TBuffer, TBytes};
2
3use std::string::String;
4
5impl TBytes for String {
6    fn size(&self) -> usize {
7        self.len() + 0usize.size()
8    }
9
10    fn to_bytes(&self) -> Vec<u8> {
11        let mut buffer = Vec::with_capacity(self.size());
12
13        buffer.append(&mut self.len().to_bytes());
14        buffer.append(&mut self.as_bytes().to_vec());
15
16        buffer
17    }
18
19    fn from_bytes(buffer: &mut TBuffer) -> Option<Self>
20    where
21        Self: Sized,
22    {
23        if buffer.len() < 0usize.size() {
24            return None;
25        }
26        let len = usize::from_bytes(buffer)?;
27        if buffer.len() < len {
28            let mut bytes = len.to_bytes();
29            while let Some(byte) = bytes.pop() {
30                buffer.insert(0, byte);
31            }
32            return None;
33        }
34
35        let mut res = String::with_capacity(len);
36        let mut iter = buffer.drain(..len);
37        for _ in 0..len {
38            res.push(iter.next()? as char);
39        }
40        drop(iter);
41        Some(res)
42    }
43}
44
45#[cfg(test)]
46mod test {
47    use crate::TBytes;
48
49    #[test]
50    fn string() {
51        let a = String::from("Hello World!!!\nHow!!!");
52
53        let mut b = a.to_bytes();
54
55        let other = String::from_bytes(&mut b).unwrap();
56
57        assert_eq!(a, other)
58    }
59
60    #[test]
61    fn incomplete() {
62        let mut buffer = Vec::new();
63        buffer.append(&mut 4usize.to_bytes());
64        buffer.push(b'g');
65        buffer.push(b'r');
66        buffer.push(b'a');
67        let clone_buffer = buffer.clone();
68
69        let other_buffer = String::from_bytes(&mut buffer);
70        if let Some(other_buffer) = other_buffer {
71            panic!("This should be possible! Other buffer: {other_buffer:?}");
72        }
73
74        assert_eq!(buffer, clone_buffer);
75        buffer.push(b'y');
76
77        let value = String::from_bytes(&mut buffer).unwrap();
78        assert_eq!(value, String::from("gray"))
79    }
80}