gistools/parsers/read/
buffer.rs

1use crate::parsers::Reader;
2use alloc::{
3    string::{String, ToString},
4    vec::Vec,
5};
6use core::cell::RefCell;
7use half::f16;
8use pbf::bit_cast::BitCast;
9
10const MAX_VARINT_LENGTH: usize = u64::BITS as usize * 8 / 7 + 1;
11const BIT_SHIFT: [u64; 10] = [0, 7, 14, 21, 28, 35, 42, 49, 56, 63];
12
13/// The `Buffer` struct is used to read and write Buffer messages.
14///
15/// ## Description
16///
17/// This works as a wrapper around a byte buffer. The idea is to have an opinionated reading/writing
18/// API for little-endian encodings for various signed and unsigned integer types. It also includes
19/// basic varint encoding and decoding.
20///
21/// ## Usage
22///
23/// Create a new Buffer instance:
24/// ```rs
25/// use gistools::util::Buffer;
26///
27/// let mut buf = Buffer::new();
28/// ```
29/// Create a Buffer instance from a byte buffer:
30/// ```rs
31/// use gistools::util::Buffer;
32///
33/// let mut vec = vec![0x0A, 0x03, 0x74, 0x65, 0x73, 0x74];
34/// let mut buf = Buffer::new(vec);
35/// // DO STUFF
36/// let res = buf.take();
37/// ```
38#[derive(Debug, Default, Clone, PartialEq)]
39pub struct Buffer {
40    buf: Vec<u8>,
41    pos: usize,
42}
43impl From<Vec<u8>> for Buffer {
44    fn from(buf: Vec<u8>) -> Buffer {
45        Buffer { buf, pos: 0 }
46    }
47}
48impl Buffer {
49    /// Create a new Buffer instance.
50    pub fn new(buf: Vec<u8>) -> Buffer {
51        Buffer { buf, pos: 0 }
52    }
53
54    /// See the contents of the buffer
55    pub fn buf(&self) -> &[u8] {
56        &self.buf
57    }
58
59    /// Get the position to read from the buffer next.
60    pub fn pos(&self) -> usize {
61        self.pos
62    }
63
64    /// Set the position to read from the buffer next.
65    pub fn set_pos(&mut self, pos: usize) {
66        self.pos = pos;
67    }
68
69    /// get the length of the bufer
70    pub fn len(&self) -> usize {
71        self.buf.len()
72    }
73
74    /// check if the buffer is empty
75    pub fn is_empty(&self) -> bool {
76        self.len() == 0
77    }
78
79    /// return the current u8 under the buffer
80    pub fn get_u8(&mut self) -> u8 {
81        let value = self.get_u8_at(self.pos);
82        self.pos += 1;
83
84        value
85    }
86
87    /// return the current u8 at position
88    pub fn get_u8_at(&mut self, pos: usize) -> u8 {
89        self.buf[pos]
90    }
91
92    /// set the current u8 under the buffer
93    pub fn set_u8(&mut self, value: u8) {
94        self.set_u8_at(self.pos, value);
95        self.pos += 1;
96    }
97
98    /// set the current u8 at position
99    pub fn set_u8_at(&mut self, pos: usize, value: u8) {
100        if pos >= self.buf.len() {
101            self.buf.resize(pos + 1, 0);
102        }
103        self.buf[pos] = value;
104    }
105
106    /// return the current i8 under the buffer
107    pub fn get_i8(&mut self) -> i8 {
108        let value = self.get_i8_at(self.pos);
109        self.pos += 1;
110
111        value
112    }
113
114    /// return the current i8 at position
115    pub fn get_i8_at(&mut self, pos: usize) -> i8 {
116        self.buf[pos] as i8
117    }
118
119    /// set the current u8 under the buffer
120    pub fn set_i8(&mut self, value: i8) {
121        self.set_i8_at(self.pos, value);
122        self.pos += 1;
123    }
124
125    /// set the current i8 at position
126    pub fn set_i8_at(&mut self, pos: usize, value: i8) {
127        if pos >= self.buf.len() {
128            self.buf.resize(pos + 1, 0);
129        }
130        self.buf[pos] = value as u8;
131    }
132
133    /// return the current i32 under the buffer
134    pub fn get_i32(&mut self) -> i32 {
135        let value = self.get_i32_at(self.pos);
136        // Update the position
137        self.pos += 4;
138
139        value
140    }
141
142    /// return the current i32 at position
143    pub fn get_i32_at(&mut self, pos: usize) -> i32 {
144        // Borrow the buffer and slice the next 4 bytes
145        let bytes = &self.buf[pos..pos + 4];
146
147        i32::from_le_bytes(bytes.try_into().expect("slice with incorrect length"))
148    }
149
150    /// set the current i32 under the buffer
151    pub fn set_i32(&mut self, value: i32) {
152        self.set_i32_at(self.pos, value);
153        self.pos += 4;
154    }
155
156    /// set the current i32 at position
157    pub fn set_i32_at(&mut self, pos: usize, value: i32) {
158        // Borrow the buffer and slice the next 4 bytes
159        if pos >= self.buf.len() {
160            self.buf.resize(pos + 4, 0);
161        }
162        let bytes = &mut self.buf[pos..pos + 4];
163
164        bytes.copy_from_slice(&value.to_le_bytes());
165    }
166
167    /// return the current u16 under the buffer
168    pub fn get_u16(&mut self) -> u16 {
169        let value = self.get_u16_at(self.pos);
170        // Update the position
171        self.pos += 2;
172
173        value
174    }
175
176    /// return the current u16 at position
177    pub fn get_u16_at(&mut self, pos: usize) -> u16 {
178        // Borrow the buffer and slice the next 2 bytes
179        let bytes = &self.buf[pos..pos + 2];
180
181        u16::from_le_bytes(bytes.try_into().expect("slice with incorrect length"))
182    }
183
184    /// set the current u16 under the buffer
185    pub fn set_u16(&mut self, value: u16) {
186        self.set_u16_at(self.pos, value);
187        self.pos += 2;
188    }
189
190    /// set the current u16 at position
191    pub fn set_u16_at(&mut self, pos: usize, value: u16) {
192        // Borrow the buffer and slice the next 2 bytes
193        if pos >= self.buf.len() {
194            self.buf.resize(pos + 2, 0);
195        }
196        let bytes = &mut self.buf[pos..pos + 2];
197
198        bytes.copy_from_slice(&value.to_le_bytes());
199    }
200
201    /// return the current i16 under the buffer
202    pub fn get_i16(&mut self) -> i16 {
203        let value = self.get_i16_at(self.pos);
204        // Update the position
205        self.pos += 2;
206
207        value
208    }
209
210    /// return the current i16 at position
211    pub fn get_i16_at(&mut self, pos: usize) -> i16 {
212        // Borrow the buffer and slice the next 2 bytes
213        let bytes = &self.buf[pos..pos + 2];
214
215        i16::from_le_bytes(bytes.try_into().expect("slice with incorrect length"))
216    }
217
218    /// set the current i16 under the buffer
219    pub fn set_i16(&mut self, value: i16) {
220        self.set_i16_at(self.pos, value);
221        self.pos += 2;
222    }
223
224    /// set the current i16 at position
225    pub fn set_i16_at(&mut self, pos: usize, value: i16) {
226        // Borrow the buffer and slice the next 2 bytes
227        if pos >= self.buf.len() {
228            self.buf.resize(pos + 2, 0);
229        }
230        let bytes = &mut self.buf[pos..pos + 2];
231
232        bytes.copy_from_slice(&value.to_le_bytes());
233    }
234
235    /// return the current u32 under the buffer
236    pub fn get_u32(&mut self) -> u32 {
237        let value = self.get_u32_at(self.pos);
238        // Update the position
239        self.pos += 4;
240
241        value
242    }
243
244    /// return the current u32 at position
245    pub fn get_u32_at(&mut self, pos: usize) -> u32 {
246        // Borrow the buffer and slice the next 4 bytes
247        let bytes = &self.buf[pos..pos + 4];
248
249        u32::from_le_bytes(bytes.try_into().expect("slice with incorrect length"))
250    }
251
252    /// set the current u32 under the buffer
253    pub fn set_u32(&mut self, value: u32) {
254        self.set_u32_at(self.pos, value);
255        self.pos += 4;
256    }
257
258    /// set the current u32 at position
259    pub fn set_u32_at(&mut self, pos: usize, value: u32) {
260        // Borrow the buffer and slice the next 4 bytes
261        if pos >= self.buf.len() {
262            self.buf.resize(pos + 4, 0);
263        }
264        let bytes = &mut self.buf[pos..pos + 4];
265
266        bytes.copy_from_slice(&value.to_le_bytes());
267    }
268
269    /// Return the current f32 at position
270    pub fn get_f32(&mut self) -> f32 {
271        let value = self.get_u32_at(self.pos);
272        self.pos += 4;
273        f32::from_bits(value)
274    }
275
276    /// Return the current f32 at position
277    pub fn get_f32_at(&mut self, pos: usize) -> f32 {
278        let value = self.get_u32_at(pos);
279        f32::from_bits(value)
280    }
281
282    /// Set the current f32 at position
283    pub fn set_f32(&mut self, value: f32) {
284        self.set_u32_at(self.pos, value.to_bits());
285    }
286
287    /// Set the current f32 at position
288    pub fn set_f32_at(&mut self, pos: usize, value: f32) {
289        self.set_u32_at(pos, value.to_bits());
290    }
291
292    /// return the current i32 under the buffer
293    pub fn get_i64(&mut self) -> i64 {
294        let value = self.get_i64_at(self.pos);
295        // Update the position
296        self.pos += 8;
297
298        value
299    }
300
301    /// return the current i32 at position
302    pub fn get_i64_at(&mut self, pos: usize) -> i64 {
303        // Borrow the buffer and slice the next 8 bytes
304        let bytes = &self.buf[pos..pos + 8];
305
306        i64::from_le_bytes(bytes.try_into().expect("slice with incorrect length"))
307    }
308
309    /// set the current i32 under the buffer
310    pub fn set_i64(&mut self, value: i64) {
311        self.set_i64_at(self.pos, value);
312        self.pos += 8;
313    }
314
315    /// set the current i32 at position
316    pub fn set_i64_at(&mut self, pos: usize, value: i64) {
317        // Borrow the buffer and slice the next 8 bytes
318        if pos >= self.buf.len() {
319            self.buf.resize(pos + 8, 0);
320        }
321        let bytes = &mut self.buf[pos..pos + 8];
322
323        bytes.copy_from_slice(&value.to_le_bytes());
324    }
325
326    /// return the current u64 under the buffer
327    pub fn get_u64(&mut self) -> u64 {
328        let value = self.get_u64_at(self.pos);
329        // Update the position
330        self.pos += 8;
331
332        value
333    }
334
335    /// return the current u64 at position
336    pub fn get_u64_at(&mut self, pos: usize) -> u64 {
337        // Borrow the buffer and slice the next 8 bytes
338        let bytes = &self.buf[pos..pos + 8];
339
340        u64::from_le_bytes(bytes.try_into().expect("slice with incorrect length"))
341    }
342
343    /// set the current u64 under the buffer
344    pub fn set_u64(&mut self, value: u64) {
345        self.set_u64_at(self.pos, value);
346        self.pos += 8;
347    }
348
349    /// set the current u64 at position
350    pub fn set_u64_at(&mut self, pos: usize, value: u64) {
351        // Borrow the buffer and slice the next 8 bytes
352        if pos >= self.buf.len() {
353            self.buf.resize(pos + 8, 0);
354        }
355        let bytes = &mut self.buf[pos..pos + 8];
356
357        bytes.copy_from_slice(&value.to_le_bytes());
358    }
359
360    /// Return the current f64 at position
361    pub fn get_f64(&mut self) -> f64 {
362        let value = self.get_u64_at(self.pos);
363        self.pos += 8;
364        f64::from_bits(value)
365    }
366
367    /// Return the current f64 at position
368    pub fn get_f64_at(&mut self, pos: usize) -> f64 {
369        // Borrow the buffer and slice the next 8 bytes
370        let bytes = &self.buf[pos..pos + 8];
371
372        f64::from_le_bytes(bytes.try_into().expect("slice with incorrect length"))
373    }
374
375    /// Set the current f64 at position
376    pub fn set_f64(&mut self, value: f64) {
377        self.set_f64_at(self.pos, value);
378    }
379
380    /// Set the current f64 at position
381    pub fn set_f64_at(&mut self, pos: usize, value: f64) {
382        // Borrow the buffer and slice the next 8 bytes
383        if pos >= self.buf.len() {
384            self.buf.resize(pos + 8, 0);
385        }
386        let bytes = &mut self.buf[pos..pos + 8];
387
388        bytes.copy_from_slice(&value.to_le_bytes());
389    }
390
391    /// Decode a varint from the buffer at the current position.
392    pub fn decode_varint(&mut self) -> u64 {
393        if self.pos >= self.buf.len() {
394            unreachable!();
395        }
396        let mut val: u64 = 0;
397
398        for (n, shift) in BIT_SHIFT.iter().enumerate().take(MAX_VARINT_LENGTH) {
399            let b = self.buf[self.pos] as u64;
400            self.pos += 1;
401            if n == 0 {
402                if b & 0x80 == 0 {
403                    return b;
404                }
405                val = b & 0x7f;
406            } else {
407                val |= (b & 0x7f) << shift;
408            }
409            if b < 0x80 {
410                break;
411            }
412        }
413
414        val
415    }
416
417    /// Read in a variable size value from the buffer.
418    pub fn read_varint<T>(&mut self) -> T
419    where
420        T: BitCast,
421    {
422        let val = self.decode_varint();
423        T::from_u64(val)
424    }
425
426    /// Write a u64 to the buffer.
427    pub fn write_varint<T>(&mut self, val: T)
428    where
429        T: BitCast,
430    {
431        let mut val = val.to_u64();
432
433        while val >= 0x80 {
434            self.buf.push(((val & 0x7f) | 0x80) as u8);
435            val >>= 7;
436        }
437        self.buf.push(val as u8);
438    }
439
440    /// When done writing to the buffer, call this function to take ownership
441    pub fn take(&mut self) -> Vec<u8> {
442        core::mem::take(&mut self.buf)
443    }
444
445    /// Copy a slice into the buffer
446    pub fn copy_from_slice(&mut self, offset: usize, slice: &[u8]) {
447        if offset + slice.len() > self.buf.len() {
448            self.buf.resize(offset + slice.len(), 0);
449        }
450        self.buf[offset..offset + slice.len()].copy_from_slice(slice);
451    }
452}
453
454/// A basic buffer reader for reading data from a buffer
455///
456/// Implements the [`Reader`] trait.
457#[derive(Default, Debug, Clone, PartialEq)]
458pub struct BufferReader {
459    /// The buffer
460    pub buffer: Vec<u8>, // This struct contains some data
461    cursor: RefCell<u64>,
462}
463impl BufferReader {
464    /// Creates a new buffer reader
465    pub fn new(buffer: Vec<u8>) -> Self {
466        Self { buffer, cursor: 0.into() }
467    }
468}
469impl BufferReader {
470    fn get_bytes(&self, byte_offset: Option<u64>, byte_length: usize) -> &[u8] {
471        let offset = byte_offset.unwrap_or(*self.cursor.borrow()) as usize;
472        assert!(offset + byte_length <= self.buffer.len());
473
474        let bytes = &self.buffer[offset..offset + byte_length];
475        *self.cursor.borrow_mut() = (offset + byte_length) as u64;
476        bytes
477    }
478}
479impl Reader for BufferReader {
480    fn len(&self) -> u64 {
481        self.buffer.len() as u64
482    }
483
484    // GETTERS
485
486    fn uint64(&self, byte_offset: Option<u64>, little_endian: Option<bool>) -> u64 {
487        if little_endian.unwrap_or(false) {
488            self.uint64_le(byte_offset)
489        } else {
490            self.uint64_be(byte_offset)
491        }
492    }
493    fn uint64_be(&self, byte_offset: Option<u64>) -> u64 {
494        let bytes = self.get_bytes(byte_offset, 8);
495        u64::from_be_bytes(bytes.try_into().expect("Failed to read 8 bytes"))
496    }
497    fn uint64_le(&self, byte_offset: Option<u64>) -> u64 {
498        let bytes = self.get_bytes(byte_offset, 8);
499        u64::from_le_bytes(bytes.try_into().expect("Failed to read 8 bytes"))
500    }
501
502    fn int64(&self, byte_offset: Option<u64>, little_endian: Option<bool>) -> i64 {
503        if little_endian.unwrap_or(false) {
504            self.int64_le(byte_offset)
505        } else {
506            self.int64_be(byte_offset)
507        }
508    }
509    fn int64_be(&self, byte_offset: Option<u64>) -> i64 {
510        let bytes = self.get_bytes(byte_offset, 8);
511        i64::from_be_bytes(bytes.try_into().expect("Failed to read 8 bytes"))
512    }
513    fn int64_le(&self, byte_offset: Option<u64>) -> i64 {
514        let bytes = self.get_bytes(byte_offset, 8);
515        i64::from_le_bytes(bytes.try_into().expect("Failed to read 8 bytes"))
516    }
517
518    fn f64(&self, byte_offset: Option<u64>, little_endian: Option<bool>) -> f64 {
519        if little_endian.unwrap_or(false) {
520            self.f64_le(byte_offset)
521        } else {
522            self.f64_be(byte_offset)
523        }
524    }
525    fn f64_be(&self, byte_offset: Option<u64>) -> f64 {
526        let bytes = self.get_bytes(byte_offset, 8);
527        f64::from_be_bytes(bytes.try_into().expect("Failed to read 8 bytes"))
528    }
529    fn f64_le(&self, byte_offset: Option<u64>) -> f64 {
530        let bytes = self.get_bytes(byte_offset, 8);
531        f64::from_le_bytes(bytes.try_into().expect("Failed to read 8 bytes"))
532    }
533
534    fn uint32(&self, byte_offset: Option<u64>, little_endian: Option<bool>) -> u32 {
535        if little_endian.unwrap_or(false) {
536            self.uint32_le(byte_offset)
537        } else {
538            self.uint32_be(byte_offset)
539        }
540    }
541    fn uint32_be(&self, byte_offset: Option<u64>) -> u32 {
542        let bytes = self.get_bytes(byte_offset, 4);
543        u32::from_be_bytes(bytes.try_into().expect("Failed to read 4 bytes"))
544    }
545    fn uint32_le(&self, byte_offset: Option<u64>) -> u32 {
546        let bytes = self.get_bytes(byte_offset, 4);
547        u32::from_le_bytes(bytes.try_into().expect("Failed to read 4 bytes"))
548    }
549
550    fn int32(&self, byte_offset: Option<u64>, little_endian: Option<bool>) -> i32 {
551        if little_endian.unwrap_or(false) {
552            self.int32_le(byte_offset)
553        } else {
554            self.int32_be(byte_offset)
555        }
556    }
557    fn int32_be(&self, byte_offset: Option<u64>) -> i32 {
558        let bytes = self.get_bytes(byte_offset, 4);
559        i32::from_be_bytes(bytes.try_into().expect("Failed to read 4 bytes"))
560    }
561    fn int32_le(&self, byte_offset: Option<u64>) -> i32 {
562        let bytes = self.get_bytes(byte_offset, 4);
563        i32::from_le_bytes(bytes.try_into().expect("Failed to read 4 bytes"))
564    }
565
566    fn f32(&self, byte_offset: Option<u64>, little_endian: Option<bool>) -> f32 {
567        if little_endian.unwrap_or(false) {
568            self.f32_le(byte_offset)
569        } else {
570            self.f32_be(byte_offset)
571        }
572    }
573    fn f32_be(&self, byte_offset: Option<u64>) -> f32 {
574        let bytes = self.get_bytes(byte_offset, 4);
575        f32::from_be_bytes(bytes.try_into().expect("Failed to read 4 bytes"))
576    }
577    fn f32_le(&self, byte_offset: Option<u64>) -> f32 {
578        let bytes = self.get_bytes(byte_offset, 4);
579        f32::from_le_bytes(bytes.try_into().expect("Failed to read 4 bytes"))
580    }
581
582    fn uint16(&self, byte_offset: Option<u64>, little_endian: Option<bool>) -> u16 {
583        if little_endian.unwrap_or(false) {
584            self.uint16_le(byte_offset)
585        } else {
586            self.uint16_be(byte_offset)
587        }
588    }
589    fn uint16_be(&self, byte_offset: Option<u64>) -> u16 {
590        let bytes = self.get_bytes(byte_offset, 2);
591        u16::from_be_bytes(bytes.try_into().expect("Failed to read 2 bytes"))
592    }
593    fn uint16_le(&self, byte_offset: Option<u64>) -> u16 {
594        let bytes = self.get_bytes(byte_offset, 2);
595        u16::from_le_bytes(bytes.try_into().expect("Failed to read 2 bytes"))
596    }
597
598    fn int16(&self, byte_offset: Option<u64>, little_endian: Option<bool>) -> i16 {
599        if little_endian.unwrap_or(false) {
600            self.int16_le(byte_offset)
601        } else {
602            self.int16_be(byte_offset)
603        }
604    }
605    fn int16_be(&self, byte_offset: Option<u64>) -> i16 {
606        let bytes = self.get_bytes(byte_offset, 2);
607        i16::from_be_bytes(bytes.try_into().expect("Failed to read 2 bytes"))
608    }
609    fn int16_le(&self, byte_offset: Option<u64>) -> i16 {
610        let bytes = self.get_bytes(byte_offset, 2);
611        i16::from_le_bytes(bytes.try_into().expect("Failed to read 2 bytes"))
612    }
613
614    fn f16(&self, byte_offset: Option<u64>, little_endian: Option<bool>) -> f32 {
615        if little_endian.unwrap_or(false) {
616            self.f16_le(byte_offset)
617        } else {
618            self.f16_be(byte_offset)
619        }
620    }
621    fn f16_be(&self, byte_offset: Option<u64>) -> f32 {
622        let bytes = self.get_bytes(byte_offset, 2);
623        let f = f16::from_be_bytes(bytes.try_into().expect("Failed to read 2 bytes"));
624        f32::from_bits(f.to_bits().into())
625    }
626    fn f16_le(&self, byte_offset: Option<u64>) -> f32 {
627        let bytes = self.get_bytes(byte_offset, 2);
628        let f = f16::from_le_bytes(bytes.try_into().expect("Failed to read 2 bytes"));
629        f32::from_bits(f.to_bits().into())
630    }
631
632    fn uint8(&self, byte_offset: Option<u64>) -> u8 {
633        let bytes = self.get_bytes(byte_offset, 1);
634        bytes[0]
635    }
636    fn int8(&self, byte_offset: Option<u64>) -> i8 {
637        let bytes = self.get_bytes(byte_offset, 1);
638        bytes[0] as i8
639    }
640
641    // Methods
642
643    fn tell(&self) -> u64 {
644        *self.cursor.borrow()
645    }
646    fn seek(&self, pos: u64) {
647        *self.cursor.borrow_mut() = pos;
648    }
649    fn slice(&self, begin: Option<u64>, end: Option<u64>) -> Vec<u8> {
650        let begin = begin.unwrap_or(*self.cursor.borrow()) as usize;
651        let end = end.unwrap_or(self.buffer.len() as u64) as usize;
652        assert!(end <= self.buffer.len());
653        self.buffer[begin..end].to_vec()
654    }
655    fn seek_slice(&self, size: usize) -> Vec<u8> {
656        let size = size as u64;
657        assert!(*self.cursor.borrow() + size <= self.buffer.len() as u64);
658        *self.cursor.borrow_mut() += size;
659        let cursor = *self.cursor.borrow();
660        self.slice(Some(cursor - size), Some(cursor))
661    }
662    fn parse_string(&self, byte_offset: Option<u64>, byte_length: Option<u64>) -> String {
663        let offset = byte_offset.unwrap_or(*self.cursor.borrow()) as usize;
664        let length = byte_length.unwrap_or((self.buffer.len() - offset) as u64) as usize;
665        let str_buf = &self.buffer[offset..offset + length];
666        // Remove null bytes from the byte slice before decoding it
667        let cleaned_str_buf: Vec<u8> = str_buf.iter().cloned().filter(|&b| b != 0).collect();
668        let string = String::from_utf8_lossy(&cleaned_str_buf).to_string();
669        *self.cursor.borrow_mut() = (offset + length) as u64;
670        string
671    }
672}
673impl<const N: usize> From<&[u8; N]> for BufferReader {
674    fn from(buffer: &[u8; N]) -> Self {
675        BufferReader::new(buffer.into()) // `&[u8; N]` coerces to `&[u8]` automatically here
676    }
677}
678impl From<&[u8]> for BufferReader {
679    fn from(buffer: &[u8]) -> Self {
680        BufferReader::new(buffer.into()) // Converts the slice into a `Vec<u8>` and creates a `BufferReader`
681    }
682}
683impl From<Vec<u8>> for BufferReader {
684    fn from(buffer: Vec<u8>) -> Self {
685        BufferReader::new(buffer) // Converts the slice into a `Vec<u8>` and creates a `BufferReader`
686    }
687}