plain_binary_stream/
binary_stream.rs1use std::{collections::VecDeque, io::{self, Error}};
2
3use crate::util::{PacketType, Serializable};
4
5pub enum BinaryStreamMode {
6 Read,
7 Write
8}
9
10pub struct BinaryStream {
11 pub mode: BinaryStreamMode,
12 buffer: VecDeque<u8>
13}
14
15pub fn collect_array<T, I, const N: usize>(itr: I) -> [T; N]
16 where
17 T: Default + Copy,
18 I: IntoIterator<Item = T>,
19{
20 let mut res = [T::default(); N];
21 for (it, elem) in res.iter_mut().zip(itr) {
22 *it = elem
23 }
24
25 res
26}
27
28impl BinaryStream {
29 pub fn new() -> BinaryStream {
30 BinaryStream {
31 mode: BinaryStreamMode::Write,
32 buffer: VecDeque::new()
33 }
34 }
35
36 pub fn with_capacity(expected_size: usize) -> BinaryStream {
37 BinaryStream {
38 mode: BinaryStreamMode::Write,
39 buffer: VecDeque::with_capacity(expected_size)
40 }
41 }
42
43 pub fn from_buffer(buffer: VecDeque<u8>) -> BinaryStream {
44 BinaryStream {
45 mode: BinaryStreamMode::Read,
46 buffer
47 }
48 }
49
50 pub fn from_bytes(bytes: &[u8]) -> BinaryStream {
51 BinaryStream {
52 mode: BinaryStreamMode::Read,
53 buffer: bytes.to_vec().into()
54 }
55 }
56
57 pub fn size(&self) -> usize {
58 self.buffer.len()
59 }
60
61 pub fn get_buffer(self) -> VecDeque<u8> {
62 self.buffer
63 }
64
65 pub fn get_buffer_vec(mut self) -> Vec<u8> {
66 self.buffer.make_contiguous().to_vec()
67 }
68
69 pub fn get_buffer_clone(&self) -> VecDeque<u8> {
70 self.buffer.clone()
71 }
72
73 pub fn get_buffer_vec_clone(&self) -> Vec<u8> {
74 self.buffer.clone().make_contiguous().to_vec()
75 }
76
77 pub fn write_bool(&mut self, val: bool) -> io::Result<()> {
80 self.write_buffer_single(val as u8)
81 }
82
83 pub fn write_u16(&mut self, val: u16) -> io::Result<()> {
84 self.write_buffer(&val.to_le_bytes().to_vec())
85 }
86
87 pub fn write_u32(&mut self, val: u32) -> io::Result<()> {
88 self.write_buffer(&val.to_le_bytes().to_vec())
89 }
90
91 pub fn write_u64(&mut self, val: u64) -> io::Result<()> {
92 self.write_buffer(&val.to_le_bytes().to_vec())
93 }
94
95 pub fn write_u128(&mut self, val: u128) -> io::Result<()> {
96 self.write_buffer(&val.to_le_bytes().to_vec())
97 }
98
99 pub fn write_i64(&mut self, val: i64) -> io::Result<()> {
100 self.write_buffer(&val.to_le_bytes().to_vec())
101 }
102
103 pub fn write_f32(&mut self, val: f32) -> io::Result<()> {
104 self.write_buffer(&val.to_le_bytes().to_vec())
105 }
106
107 pub fn write_string(&mut self, val: &String) -> io::Result<()> {
108 let string_bytes = val.as_bytes();
109 self.write_u32(string_bytes.len() as u32)?;
110 self.write_buffer(&val.as_bytes().to_vec())
111 }
112
113 pub fn write_byte_vec(&mut self, val: &Vec<u8>) -> io::Result<()> {
114 self.write_u32(val.len() as u32)?;
115 self.write_buffer(val)?;
116 Ok(())
117 }
118
119 pub fn write_vec<T: Serializable>(&mut self, val: &Vec<T>) -> io::Result<()> {
120 self.write_u32(val.len() as u32)?;
121 val.iter().for_each(|x| x.to_stream(self));
122 Ok(())
123 }
124
125 pub fn write_packet_type<T: PacketType>(&mut self, val: T) -> io::Result<()> {
126 self.write_buffer_single(val.to_byte())
127 }
128
129 pub fn write_buffer_size(&mut self) -> io::Result<()> {
131 self.write_u32(self.buffer.len() as u32)
132 }
133
134 pub fn read_bool(&mut self) -> io::Result<bool> {
137 self.read_buffer_single().map(|byte| byte == 1)
138 }
139
140 pub fn read_u16(&mut self) -> io::Result<u16> {
141 let bytes = collect_array(self.read_buffer(2)?);
142 Ok(u16::from_le_bytes(bytes))
143 }
144
145 pub fn read_u32(&mut self) -> io::Result<u32> {
146 let bytes = collect_array(self.read_buffer(4)?);
147 Ok(u32::from_le_bytes(bytes))
148 }
149
150 pub fn read_u64(&mut self) -> io::Result<u64> {
151 let bytes = collect_array(self.read_buffer(8)?);
152 Ok(u64::from_le_bytes(bytes))
153 }
154
155 pub fn read_u128(&mut self) -> io::Result<u128> {
156 let bytes = collect_array(self.read_buffer(16)?);
157 Ok(u128::from_le_bytes(bytes))
158 }
159
160 pub fn read_i64(&mut self) -> io::Result<i64> {
161 let bytes = collect_array(self.read_buffer(8)?);
162 Ok(i64::from_le_bytes(bytes))
163 }
164
165 pub fn read_f32(&mut self) -> io::Result<f32> {
166 let bytes = collect_array(self.read_buffer(4)?);
167 Ok(f32::from_le_bytes(bytes))
168 }
169
170 pub fn read_string(&mut self) -> io::Result<String> {
171 let string_size = self.read_u32()? as usize;
172 Ok(String::from_utf8(self.read_buffer(string_size)?).unwrap())
173 }
174
175 pub fn read_byte_vec(&mut self) -> io::Result<Vec<u8>> {
176 let vec_size = self.read_u32()? as usize;
177 self.read_buffer(vec_size)
178 }
179
180 pub fn read_vec<T: Serializable>(&mut self) -> io::Result<Vec<T>> {
181 let vec_size = self.read_u32()?;
182 let mut vec = Vec::with_capacity(vec_size as usize);
183 for _ in 0..vec_size {
184 let t = T::from_stream(self);
185 vec.push(t);
186 }
187
188 Ok(vec)
189 }
190
191 pub fn read_packet_type<T: PacketType>(&mut self) -> io::Result<T> {
192 Ok(T::from_byte(self.read_buffer_single()?).unwrap())
193 }
194
195 pub fn read_buffer_size(&mut self) -> io::Result<u32> {
196 self.read_u32()
197 }
198
199 pub fn write_buffer_single(&mut self, byte: u8) -> io::Result<()> {
202 match self.mode {
203 BinaryStreamMode::Read => Err(Error::new(io::ErrorKind::PermissionDenied, "Stream is in read-only mode")),
204 BinaryStreamMode::Write => {
205 self.buffer.push_back(byte);
206 Ok(())
207 }
208 }
209 }
210
211 pub fn write_buffer(&mut self, bytes: &Vec<u8>) -> io::Result<()> {
212 match self.mode {
213 BinaryStreamMode::Read => Err(Error::new(io::ErrorKind::PermissionDenied, "Stream is in read-only mode")),
214 BinaryStreamMode::Write => {
215 self.buffer.extend(bytes);
216 Ok(())
217 }
218 }
219 }
220
221 pub fn write_buffer_slice(&mut self, bytes: &[u8]) -> io::Result<()> {
222 match self.mode {
223 BinaryStreamMode::Read => Err(Error::new(io::ErrorKind::PermissionDenied, "Stream is in read-only mode")),
224 BinaryStreamMode::Write => {
225 self.buffer.extend(bytes);
226 Ok(())
227 }
228 }
229 }
230
231 pub fn read_buffer_single(&mut self) -> io::Result<u8> {
232 match self.mode {
233 BinaryStreamMode::Write => Err(Error::new(io::ErrorKind::PermissionDenied, "Stream is in writing mode")),
234 BinaryStreamMode::Read => {
235 Ok(self.buffer.pop_front().unwrap())
236 }
237 }
238 }
239
240 pub fn read_buffer(&mut self, count: usize) -> io::Result<Vec<u8>> {
241 match self.mode {
242 BinaryStreamMode::Write => Err(Error::new(io::ErrorKind::PermissionDenied, "Stream is in writing mode")),
243 BinaryStreamMode::Read => {
244 let mut bytes = vec![];
245 for _ in 0..count {
246 bytes.push(self.buffer.pop_front().unwrap());
247 }
248
249 Ok(bytes)
250 }
251 }
252 }
253
254 }