sheave_core/
byte_buffer.rs

1mod insufficient_buffer_length;
2
3use std::io::Result as IOResult;
4use crate::U24_MAX;
5pub use self::insufficient_buffer_length::*;
6
7/// The stream buffer for encoding/decoding chunk data.
8#[derive(Debug, Clone, Default)]
9pub struct ByteBuffer {
10    bytes: Vec<u8>,
11    offset: usize
12}
13
14impl ByteBuffer {
15    /// Computes remained length in this buffer.
16    pub fn remained(&self) -> usize {
17        self.bytes.len() - self.offset
18    }
19
20    /// Peeks 1 byte from buffer.
21    /// This keeps buffer's current offset.
22    ///
23    /// # Errors
24    ///
25    /// * [`InSufficientBufferLength`]
26    ///
27    /// When buffer isn't remained at least 1 byte.
28    ///
29    /// # Examples
30    ///
31    /// ```rust
32    /// use rand::random;
33    /// use sheave_core::ByteBuffer;
34    ///
35    /// let n = random::<u8>();
36    /// let mut buffer: ByteBuffer = n.to_be_bytes().to_vec().into();
37    /// assert!(buffer.peek_u8().is_ok());
38    /// let bytes: Vec<u8> = buffer.into();
39    /// // Buffer isn't consumed.
40    /// assert_eq!(n.to_be_bytes().as_slice(), &bytes);
41    ///
42    /// let mut buffer: ByteBuffer = Vec::new().into();
43    /// assert!(buffer.peek_u8().is_err());
44    /// ```
45    ///
46    /// [`InsufficientBufferLength`]: InsufficientBufferLength
47    pub fn peek_u8(&self) -> IOResult<u8> {
48        let offset = self.offset;
49        self.bytes.get(offset).map(|byte| *byte).ok_or(insufficient_buffer_length(1, self.remained()))
50    }
51
52    /// Tries getting 1 byte from buffer.
53    ///
54    /// # Errors
55    ///
56    /// * [`InsufficientBufferLength`]
57    ///
58    /// When buffer isn't remained at least 1 byte.
59    ///
60    /// # Examples
61    ///
62    /// ```rust
63    /// use rand::random;
64    /// use sheave_core::ByteBuffer;
65    ///
66    /// let mut buffer: ByteBuffer  = random::<u8>().to_be_bytes().to_vec().into();
67    /// assert!(buffer.get_u8().is_ok());
68    ///
69    /// let mut buffer: ByteBuffer = Vec::new().into();
70    /// assert!(buffer.get_u8().is_err());
71    /// ```
72    ///
73    /// [`InsufficientBufferLength`]: InsufficientBufferLength
74    pub fn get_u8(&mut self) -> IOResult<u8> {
75        let offset = self.offset;
76        self.bytes.get(offset).map(
77            |byte| {
78                self.offset += 1;
79                *byte
80            }
81        ).ok_or(insufficient_buffer_length(1, self.remained()))
82    }
83
84    /// Tries getting 2 bytes from buffer, as the big endian.
85    ///
86    /// # Errors
87    ///
88    /// * [`InsufficientBufferLength`]
89    ///
90    /// When buffer isn't remained at least 2 bytes.
91    ///
92    /// # Examples
93    ///
94    /// ```rust
95    /// use rand::random;
96    /// use sheave_core::ByteBuffer;
97    ///
98    /// let mut buffer: ByteBuffer = random::<u16>().to_be_bytes().to_vec().into();
99    /// assert!(buffer.get_u16_be().is_ok());
100    ///
101    /// let mut buffer: ByteBuffer = Vec::new().into();
102    /// assert!(buffer.get_u16_be().is_err());
103    /// ```
104    ///
105    /// [`InsufficientBufferLength`]: InsufficientBufferLength
106    pub fn get_u16_be(&mut self) -> IOResult<u16> {
107        let offset = self.offset;
108        self.bytes.get(offset..(offset + 2)).map(
109            |bytes| {
110                self.offset += bytes.len();
111                let mut _bytes: [u8; 2] = [0; 2];
112                _bytes.copy_from_slice(bytes);
113                u16::from_be_bytes(_bytes)
114            }
115        ).ok_or(insufficient_buffer_length(2, self.remained()))
116    }
117
118    /// Tries getting **signed** 3 bytes from buffer, as the big endian.
119    ///
120    /// # Errors
121    ///
122    /// * [`InsufficientBufferLength`]
123    ///
124    /// When buffer isn't remained at least 2 bytes.
125    ///
126    /// # Examples
127    ///
128    /// ```rust
129    /// use rand::{
130    ///     Fill,
131    ///     thread_rng
132    /// };
133    /// use sheave_core::ByteBuffer;
134    ///
135    /// let mut bytes: [u8; 3] = [0; 3];
136    /// bytes.try_fill(&mut thread_rng()).unwrap();
137    /// let mut buffer: ByteBuffer = bytes.to_vec().into();
138    /// assert!(buffer.get_i24_be().is_ok());
139    ///
140    /// let mut buffer: ByteBuffer = Vec::new().into();
141    /// assert!(buffer.get_i24_be().is_err());
142    /// ```
143    ///
144    /// [`InsufficientBufferLength`]: InsufficientBufferLength
145    pub fn get_i24_be(&mut self) -> IOResult<i32> {
146        let offset = self.offset;
147        self.bytes.get(offset..(offset + 3)).map(
148            |bytes| {
149                self.offset += bytes.len();
150                let mut _bytes: [u8; 4] = [0; 4];
151                _bytes[1..].copy_from_slice(bytes);
152                let mut n = i32::from_be_bytes(_bytes);
153
154                // Moves the most significant bit if this is a negative number in 3 bytes.
155                if (n & 0x00800000) != 0 {
156                    n ^= -1;
157                    n += 1;
158                }
159
160                n
161            }
162        ).ok_or(insufficient_buffer_length(3, self.remained()))
163    }
164
165    /// Tries getting 3 bytes from buffer, as the big endian.
166    ///
167    /// # Errors
168    ///
169    /// * [`InsufficientBufferLength`]
170    ///
171    /// When buffer isn't remained at least 2 bytes.
172    ///
173    /// # Examples
174    ///
175    /// ```rust
176    /// use rand::{
177    ///     Fill,
178    ///     thread_rng
179    /// };
180    /// use sheave_core::ByteBuffer;
181    ///
182    /// let mut bytes: [u8; 3] = [0; 3];
183    /// bytes.try_fill(&mut thread_rng()).unwrap();
184    /// let mut buffer: ByteBuffer = bytes.to_vec().into();
185    /// assert!(buffer.get_u24_be().is_ok());
186    ///
187    /// let mut buffer: ByteBuffer = Vec::new().into();
188    /// assert!(buffer.get_u24_be().is_err());
189    /// ```
190    ///
191    /// [`InsufficientBufferLength`]: InsufficientBufferLength
192    pub fn get_u24_be(&mut self) -> IOResult<u32> {
193        let offset = self.offset;
194        self.bytes.get(offset..(offset + 3)).map(
195            |bytes| {
196                self.offset += bytes.len();
197                let mut _bytes: [u8; 4] = [0; 4];
198                _bytes[1..].copy_from_slice(bytes);
199                u32::from_be_bytes(_bytes)
200            }
201        ).ok_or(insufficient_buffer_length(3, self.remained()))
202    }
203
204    /// Tries getting 4 bytes from buffer, as the big endian.
205    ///
206    /// # Errors
207    ///
208    /// * [`InsufficientBufferLength`]
209    ///
210    /// When buffer isn't remained at least 4 bytes.
211    ///
212    /// # Examples
213    ///
214    /// ```rust
215    /// use rand::random;
216    /// use sheave_core::ByteBuffer;
217    ///
218    /// let mut buffer: ByteBuffer = random::<u32>().to_be_bytes().to_vec().into();
219    /// assert!(buffer.get_u32_be().is_ok());
220    ///
221    /// let mut buffer: ByteBuffer = Vec::new().into();
222    /// assert!(buffer.get_u32_be().is_err());
223    /// ```
224    ///
225    /// [`InsufficientBufferLength`]: InsufficientBufferLength
226    pub fn get_u32_be(&mut self) -> IOResult<u32> {
227        let offset = self.offset;
228        self.bytes.get(offset..(offset + 4)).map(
229            |bytes| {
230                self.offset += bytes.len();
231                let mut _bytes: [u8; 4] = [0; 4];
232                _bytes.copy_from_slice(bytes);
233                u32::from_be_bytes(_bytes)
234            }
235        ).ok_or(insufficient_buffer_length(4, self.remained()))
236    }
237
238    /// Tries getting 8 bytes from buffer, as a 64 bits floating point number.
239    ///
240    /// # Errors
241    ///
242    /// * [`InsufficientBufferLength`]
243    ///
244    /// When buffer isn't remained at least 8 bytes.
245    ///
246    /// # Examples
247    ///
248    /// ```rust
249    /// use rand::random;
250    /// use sheave_core::ByteBuffer;
251    ///
252    /// let mut buffer: ByteBuffer = random::<u64>().to_be_bytes().to_vec().into();
253    /// assert!(buffer.get_f64().is_ok());
254    ///
255    /// let mut buffer: ByteBuffer = Vec::new().into();
256    /// assert!(buffer.get_f64().is_err());
257    /// ```
258    ///
259    /// [`InsufficientBufferLength`]: InsufficientBufferLength
260    pub fn get_f64(&mut self) -> IOResult<f64> {
261        let offset = self.offset;
262        self.bytes.get(offset..(offset + 8)).map(
263            |bytes| {
264                self.offset += bytes.len();
265                let mut _bytes: [u8; 8] = [0; 8];
266                _bytes.copy_from_slice(bytes);
267                f64::from_be_bytes(_bytes)
268            }
269        ).ok_or(insufficient_buffer_length(8, self.remained()))
270    }
271
272    /// Tries getting arbitrary bytes from buffer.
273    ///
274    /// # Erorrs
275    ///
276    /// * `InsufficientBufferLength`
277    ///
278    /// When buffer isn't remained at least specified length.
279    ///
280    /// # Examples
281    ///
282    /// ```rust
283    /// use sheave_core::ByteBuffer;
284    ///
285    /// let bytes = "hello world!".as_bytes();
286    /// let mut buffer: ByteBuffer = bytes.to_vec().into();
287    /// assert!(buffer.get_bytes(bytes.len()).is_ok());
288    ///
289    /// let mut buffer: ByteBuffer = Vec::new().into();
290    /// assert!(buffer.get_bytes(bytes.len()).is_err())
291    /// ```
292    ///
293    /// [`InsufficientBufferLength`]: InsufficientBufferLength
294    pub fn get_bytes(&mut self, len: usize) -> IOResult<&[u8]> {
295        let offset = self.offset;
296        self.bytes.get(offset..(offset + len)).map(
297            |bytes| {
298                self.offset += len;
299                bytes
300            }
301        ).ok_or(insufficient_buffer_length(len, self.remained()))
302    }
303
304    /// Puts 1 byte into buffer.
305    pub fn put_u8(&mut self, n: u8) {
306        self.bytes.push(n);
307    }
308
309    /// Puts 2 bytes into buffer, as the big endian.
310    pub fn put_u16_be(&mut self, n: u16) {
311        self.bytes.extend_from_slice(&n.to_be_bytes());
312    }
313
314    /// Puts **signed** 3 bytes into buffer, as the big endian.
315    ///
316    /// # Panics
317    ///
318    /// Its value must be the range of 24 bits.
319    /// If it exceeds, a panic is occured.
320    ///
321    /// # Examples
322    ///
323    /// ```rust
324    /// use std::panic::catch_unwind;
325    ///
326    /// let result = catch_unwind(
327    ///     || {
328    ///         use sheave_core::ByteBuffer;
329    ///
330    ///         let mut buffer = ByteBuffer::default();
331    ///         buffer.put_i24_be((0x00ffffff + 1) as i32);
332    ///     }
333    /// );
334    /// assert!(result.is_err())
335    /// ```
336    pub fn put_i24_be(&mut self, n: i32) {
337        assert!(n <= U24_MAX as i32);
338        self.bytes.extend_from_slice(&n.to_be_bytes()[1..]);
339    }
340
341    /// Puts 3 bytes into buffer, as the big endian.
342    ///
343    /// # Panics
344    ///
345    /// Its value must be the range of 24 bits.
346    /// If it exceeds, a panic is occured.
347    ///
348    /// # Examples
349    ///
350    /// ```rust
351    /// use std::panic::catch_unwind;
352    ///
353    /// let result = catch_unwind(
354    ///     || {
355    ///         use sheave_core::ByteBuffer;
356    ///
357    ///         let mut buffer = ByteBuffer::default();
358    ///         buffer.put_u24_be((0x00ffffff + 1) as u32);
359    ///     }
360    /// );
361    /// assert!(result.is_err())
362    /// ```
363    pub fn put_u24_be(&mut self, n: u32) {
364        assert!(n <= U24_MAX as u32);
365        self.bytes.extend_from_slice(&n.to_be_bytes()[1..]);
366    }
367
368    /// Puts 4 bytes into buffer, as the big endian.
369    pub fn put_u32_be(&mut self, n: u32) {
370        self.bytes.extend_from_slice(&n.to_be_bytes());
371    }
372
373    /// Puts 8 bytes into buffer, as a 64 bits floating point number.
374    pub fn put_f64(&mut self, n: f64) {
375        self.bytes.extend_from_slice(&n.to_be_bytes());
376    }
377
378    /// Puts arbitrary bytes into buffer.
379    pub fn put_bytes(&mut self, bytes: &[u8]) {
380        self.bytes.extend_from_slice(bytes);
381    }
382}
383
384impl From<Vec<u8>> for ByteBuffer {
385    fn from(bytes: Vec<u8>) -> Self {
386        Self {
387            bytes,
388            offset: 0
389        }
390    }
391}
392
393impl From<ByteBuffer> for Vec<u8> {
394    /// Converts remained bytes into Vec.
395    ///
396    /// # Examples
397    ///
398    /// ```rust
399    /// use rand::{
400    ///     Fill,
401    ///     thread_rng
402    /// };
403    /// use sheave_core::ByteBuffer;
404    ///
405    /// // When all byte is remained.
406    /// let mut array: [u8; 128] = [0; 128];
407    /// array.try_fill(&mut thread_rng()).unwrap();
408    /// let mut buffer = ByteBuffer::default();
409    /// buffer.put_bytes(&array);
410    /// let bytes: Vec<u8> = buffer.into();
411    /// assert_eq!(array.as_slice(), &bytes);
412    ///
413    /// // When some bytes are consumed.
414    /// let mut array: [u8; 128] = [0; 128];
415    /// array.try_fill(&mut thread_rng()).unwrap();
416    /// let mut buffer = ByteBuffer::default();
417    /// buffer.put_bytes(&array);
418    /// buffer.get_u8().unwrap();
419    /// let bytes: Vec<u8> = buffer.into();
420    /// assert_eq!(&array[1..], &bytes)
421    /// ```
422    fn from(buffer: ByteBuffer) -> Self {
423        buffer.bytes[buffer.offset..].to_vec()
424    }
425}