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}