1use crate::{TBuffer, TBytes};
2
3impl<T: TBytes> TBytes for Vec<T> {
4 fn size(&self) -> usize {
5 let mut size = 0usize.size();
6 for seg in self.iter() {
7 size += seg.size()
8 }
9 size
10 }
11
12 fn to_bytes(&self) -> Vec<u8> {
13 let mut buffer = Vec::with_capacity(self.size());
14
15 buffer.append(&mut self.len().to_bytes());
16
17 for seg in self.iter() {
18 buffer.append(&mut seg.to_bytes())
19 }
20
21 buffer
22 }
23
24 fn from_bytes(buffer: &mut TBuffer) -> Option<Self>
25 where
26 Self: Sized,
27 {
28 if buffer.len() < 0usize.size() {
29 return None;
30 }
31 let len = usize::from_bytes(buffer)?;
32 let mut res = Vec::with_capacity(len);
33
34 for _ in 0..len {
35 if let Some(element) = T::from_bytes(buffer) {
36 res.push(element)
37 } else {
38 while let Some(element) = res.pop() {
39 let mut bytes = element.to_bytes();
40 while let Some(byte) = bytes.pop() {
41 buffer.insert(0, byte);
42 }
43 }
44 let mut bytes = len.to_bytes();
45 while let Some(byte) = bytes.pop() {
46 buffer.insert(0, byte);
47 }
48 return None;
49 }
50 }
51
52 Some(res)
53 }
54}
55
56#[cfg(test)]
57mod test {
58 use crate::TBytes;
59
60 #[test]
61 fn vec_string() {
62 let a = vec![String::from("Hello There!"), String::from("I am here!")];
63
64 let mut b = a.to_bytes();
65
66 let other = <Vec<String>>::from_bytes(&mut b).unwrap();
67
68 assert_eq!(a, other)
69 }
70
71 #[test]
72 fn incoplete() {
73 let mut buffer = Vec::new();
74 buffer.append(&mut 4usize.to_bytes());
75 buffer.push(21);
76 buffer.push(69);
77 let clone_buffer = buffer.clone();
78
79 let other_buffer = Vec::<u8>::from_bytes(&mut buffer);
80 if let Some(other_buffer) = other_buffer {
81 panic!("This should be possible! Other buffer: {other_buffer:?}");
82 }
83
84 assert_eq!(buffer, clone_buffer)
85 }
86
87 #[test]
88 fn incoplete_unsized() {
89 let mut buffer = Vec::new();
90 buffer.append(&mut 4usize.to_bytes());
91 buffer.append(&mut String::from("Hello World!").to_bytes());
92 buffer.append(&mut String::from("Hello Made!").to_bytes());
93 buffer.append(&mut String::from("Samuel?").to_bytes());
94 let clone_buffer = buffer.clone();
95
96 let other_buffer = Vec::<String>::from_bytes(&mut buffer);
97 if let Some(other_buffer) = other_buffer {
98 panic!("This should be possible! Other buffer: {other_buffer:?}");
99 }
100
101 assert_eq!(buffer, clone_buffer)
102 }
103}