liverust_lib/netio/
bytes_reader.rs

1use super::bytes_errors::{BytesReadError, BytesReadErrorValue};
2use byteorder::{ByteOrder, ReadBytesExt};
3use bytes::BytesMut;
4use std::io;
5use std::io::Cursor;
6use std::time::Duration;
7
8use tokio::{prelude::*, stream::StreamExt, time::timeout};
9use tokio_util::codec::BytesCodec;
10use tokio_util::codec::Framed;
11
12pub struct BytesReader {
13    buffer: BytesMut,
14}
15impl BytesReader {
16    pub fn new(input: BytesMut) -> Self {
17        Self { buffer: input }
18    }
19
20    // pub fn new_with_extend(input: BytesMut, extend: &[u8]) -> BytesReader {
21    //     let mut reader = BytesReader { buffer: input };
22    //     reader.extend_from_slice(extend);
23    //     reader
24    // }
25
26    pub fn extend_from_slice(&mut self, extend: &[u8]) {
27        self.buffer.extend_from_slice(extend)
28    }
29    pub fn read_bytes(&mut self, bytes_num: usize) -> Result<BytesMut, BytesReadError> {
30        if self.buffer.len() < bytes_num {
31            return Err(BytesReadError {
32                value: BytesReadErrorValue::NotEnoughBytes,
33            });
34        }
35        Ok(self.buffer.split_to(bytes_num))
36    }
37
38    pub fn advance_bytes(&mut self, bytes_num: usize) -> Result<BytesMut, BytesReadError> {
39        if self.buffer.len() < bytes_num {
40            return Err(BytesReadError {
41                value: BytesReadErrorValue::NotEnoughBytes,
42            });
43        }
44
45        //here maybe optimised
46        Ok(self.buffer.clone().split_to(bytes_num))
47    }
48
49    pub fn read_bytes_cursor(&mut self, bytes_num: usize) -> Result<Cursor<BytesMut>, BytesReadError> {
50        let tmp_bytes = self.read_bytes(bytes_num)?;
51        let tmp_cursor = Cursor::new(tmp_bytes);
52        Ok(tmp_cursor)
53    }
54
55    pub fn advance_bytes_cursor(
56        &mut self,
57        bytes_num: usize,
58    ) -> Result<Cursor<BytesMut>, BytesReadError> {
59        let tmp_bytes = self.advance_bytes(bytes_num)?;
60        let tmp_cursor = Cursor::new(tmp_bytes);
61        Ok(tmp_cursor)
62    }
63
64    pub fn read_u8(&mut self) -> Result<u8, BytesReadError> {
65        let mut cursor = self.read_bytes_cursor(1)?;
66
67        Ok(cursor.read_u8()?)
68    }
69
70    pub fn advance_u8(&mut self) -> Result<u8, BytesReadError> {
71        let mut cursor = self.advance_bytes_cursor(1)?;
72        Ok(cursor.read_u8()?)
73    }
74
75    pub fn read_u16<T: ByteOrder>(&mut self) -> Result<u16, BytesReadError> {
76        let mut cursor = self.read_bytes_cursor(2)?;
77        let val = cursor.read_u16::<T>()?;
78        Ok(val)
79    }
80
81    pub fn read_u24<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError> {
82        let mut cursor = self.read_bytes_cursor(3)?;
83        let val = cursor.read_u24::<T>()?;
84        Ok(val)
85    }
86
87    pub fn advance_u24<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError> {
88        let mut cursor = self.advance_bytes_cursor(3)?;
89        Ok(cursor.read_u24::<T>()?)
90    }
91
92    pub fn read_u32<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError> {
93        let mut cursor = self.read_bytes_cursor(4)?;
94        let val = cursor.read_u32::<T>()?;
95
96        Ok(val)
97    }
98
99    pub fn read_f64<T: ByteOrder>(&mut self) -> Result<f64, BytesReadError> {
100        let mut cursor = self.read_bytes_cursor(8)?;
101        let val = cursor.read_f64::<T>()?;
102
103        Ok(val)
104    }
105}
106