1use std::fmt::Display;
2
3#[cfg(feature="writing")]
4#[cfg(not(feature="tokio"))]
5pub mod writer;
6#[cfg(feature="reading")]
7#[cfg(not(feature="tokio"))]
8pub mod reader;
9
10#[cfg(feature="writing")]
11#[cfg(feature="tokio")]
12pub mod async_writer;
13#[cfg(feature="reading")]
14#[cfg(feature="tokio")]
15pub mod async_reader;
16
17#[derive(Debug, Clone)]
29pub struct Segment {
30 seg: Vec<u8>
31}
32
33impl Segment {
34 pub fn new() -> Self {
36 Self {
37 seg: Vec::new()
38 }
39 }
40
41 pub fn to_readable(segments: Vec<Segment>) -> Vec<String> {
42 segments.iter().map(|s| s.to_string()).collect::<Vec<String>>()
43 }
44
45 pub fn append(&mut self, seg: Segment) {
47 self.seg.extend(seg.seg);
48 }
49
50 pub(crate) fn len(&self) -> usize {
51 self.seg.len()
52 }
53
54 pub fn to_raw(&self) -> Vec<u8> {
55 self.seg.clone()
56 }
57
58}
59
60impl Default for Segment {
61 fn default() -> Self {
62 Self::new()
63 }
64}
65
66impl AsRef<[u8]> for Segment {
67 fn as_ref(&self) -> &[u8] {
68 &self.seg
69 }
70}
71
72impl From<&[u8]> for Segment {
73 fn from(value: &[u8]) -> Self {
74 Self {
75 seg: value.to_vec()
76 }
77 }
78}
79
80impl From<Vec<u8>> for Segment {
81 fn from(value: Vec<u8>) -> Self {
82 Self {
83 seg: value
84 }
85 }
86}
87
88impl From<String> for Segment {
89 fn from(value: String) -> Self {
90 Self {
91 seg: value.as_bytes().to_vec()
92 }
93 }
94}
95
96impl Display for Segment {
97 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
98 write!(f, "{}", String::from_utf8_lossy(&self.seg))
99 }
100}
101
102mod tests {
103
104 #[test]
105 fn test_writer() {
106 let mut writer = crate::writer::VarWriter::new();
108
109 writer.add_string("Hello, ");
111 writer.add_string("World!");
112
113 let mut stream: Vec<u8> = Vec::new();
115
116 writer.send(&mut stream).expect("Failed to send data");
118 }
119
120 #[test]
121 fn test_reader() {
122 let stream: Vec<u8> = vec![21, 7, 0, 0, 0, 72, 101, 108, 108, 111, 44, 32, 6, 0, 0, 0, 87, 111, 114, 108, 100, 33];
124 let mut fake_stream = stream.as_slice();
126
127 let mut reader = crate::reader::VarReader::new(&mut fake_stream);
129
130 let data = reader.read_data().unwrap();
132 assert_eq!(data[0].to_string(), "Hello, ");
133 assert_eq!(data[1].to_string(), "World!");
134 }
135
136 #[test]
137 fn both_test() {
138 let mut writer = crate::writer::VarWriter::new();
140
141 writer.add_string("Hello, ");
143 writer.add_string("World!");
144
145 let mut stream: Vec<u8> = Vec::new();
147
148 writer.send(&mut stream).expect("Failed to send data");
150
151 let mut fake_stream = stream.as_slice();
153
154 let mut reader = crate::reader::VarReader::new(&mut fake_stream);
156
157 let data = reader.read_data().unwrap();
159 assert_eq!(data[0].to_string(), "Hello, ");
160 assert_eq!(data[1].to_string(), "World!");
161 }
162}