xref: /xiu/library/bytesio/src/bytes_reader.rs (revision 06c50324)
188325f54SHarlanC use {
28e71d710SHarlan     super::{
38e71d710SHarlan         bytes_errors::{BytesReadError, BytesReadErrorValue},
48e71d710SHarlan         bytesio::TNetIO,
58e71d710SHarlan     },
688325f54SHarlanC     byteorder::{ByteOrder, ReadBytesExt},
788325f54SHarlanC     bytes::{BufMut, BytesMut},
88e71d710SHarlan     std::{io::Cursor, sync::Arc},
98e71d710SHarlan     tokio::sync::Mutex,
1088325f54SHarlanC };
1188325f54SHarlanC 
1288325f54SHarlanC pub struct BytesReader {
1388325f54SHarlanC     buffer: BytesMut,
1488325f54SHarlanC }
1588325f54SHarlanC impl BytesReader {
new(input: BytesMut) -> Self1688325f54SHarlanC     pub fn new(input: BytesMut) -> Self {
1788325f54SHarlanC         Self { buffer: input }
1888325f54SHarlanC     }
1988325f54SHarlanC 
extend_from_slice(&mut self, extend: &[u8])2088325f54SHarlanC     pub fn extend_from_slice(&mut self, extend: &[u8]) {
2188325f54SHarlanC         let remaining_mut = self.buffer.remaining_mut();
2288325f54SHarlanC         let extend_length = extend.len();
2388325f54SHarlanC 
2488325f54SHarlanC         if extend_length > remaining_mut {
2588325f54SHarlanC             let additional = extend_length - remaining_mut;
2688325f54SHarlanC             self.buffer.reserve(additional);
2788325f54SHarlanC         }
2888325f54SHarlanC 
2988325f54SHarlanC         self.buffer.extend_from_slice(extend)
3088325f54SHarlanC     }
3188325f54SHarlanC 
read_bytes(&mut self, bytes_num: usize) -> Result<BytesMut, BytesReadError>3288325f54SHarlanC     pub fn read_bytes(&mut self, bytes_num: usize) -> Result<BytesMut, BytesReadError> {
3388325f54SHarlanC         if self.buffer.len() < bytes_num {
3488325f54SHarlanC             return Err(BytesReadError {
3588325f54SHarlanC                 value: BytesReadErrorValue::NotEnoughBytes,
3688325f54SHarlanC             });
3788325f54SHarlanC         }
3888325f54SHarlanC         Ok(self.buffer.split_to(bytes_num))
3988325f54SHarlanC     }
4088325f54SHarlanC 
advance_bytes(&mut self, bytes_num: usize) -> Result<BytesMut, BytesReadError>4188325f54SHarlanC     pub fn advance_bytes(&mut self, bytes_num: usize) -> Result<BytesMut, BytesReadError> {
4288325f54SHarlanC         if self.buffer.len() < bytes_num {
4388325f54SHarlanC             return Err(BytesReadError {
4488325f54SHarlanC                 value: BytesReadErrorValue::NotEnoughBytes,
4588325f54SHarlanC             });
4688325f54SHarlanC         }
4788325f54SHarlanC 
4888325f54SHarlanC         //here maybe optimised
4988325f54SHarlanC         Ok(self.buffer.clone().split_to(bytes_num))
5088325f54SHarlanC     }
5188325f54SHarlanC 
read_bytes_cursor( &mut self, bytes_num: usize, ) -> Result<Cursor<BytesMut>, BytesReadError>5288325f54SHarlanC     pub fn read_bytes_cursor(
5388325f54SHarlanC         &mut self,
5488325f54SHarlanC         bytes_num: usize,
5588325f54SHarlanC     ) -> Result<Cursor<BytesMut>, BytesReadError> {
5688325f54SHarlanC         let tmp_bytes = self.read_bytes(bytes_num)?;
5788325f54SHarlanC         let tmp_cursor = Cursor::new(tmp_bytes);
5888325f54SHarlanC         Ok(tmp_cursor)
5988325f54SHarlanC     }
6088325f54SHarlanC 
advance_bytes_cursor( &mut self, bytes_num: usize, ) -> Result<Cursor<BytesMut>, BytesReadError>6188325f54SHarlanC     pub fn advance_bytes_cursor(
6288325f54SHarlanC         &mut self,
6388325f54SHarlanC         bytes_num: usize,
6488325f54SHarlanC     ) -> Result<Cursor<BytesMut>, BytesReadError> {
6588325f54SHarlanC         let tmp_bytes = self.advance_bytes(bytes_num)?;
6688325f54SHarlanC         let tmp_cursor = Cursor::new(tmp_bytes);
6788325f54SHarlanC         Ok(tmp_cursor)
6888325f54SHarlanC     }
6988325f54SHarlanC 
read_u8(&mut self) -> Result<u8, BytesReadError>7088325f54SHarlanC     pub fn read_u8(&mut self) -> Result<u8, BytesReadError> {
7188325f54SHarlanC         let mut cursor = self.read_bytes_cursor(1)?;
7288325f54SHarlanC 
7388325f54SHarlanC         Ok(cursor.read_u8()?)
7488325f54SHarlanC     }
7588325f54SHarlanC 
advance_u8(&mut self) -> Result<u8, BytesReadError>7688325f54SHarlanC     pub fn advance_u8(&mut self) -> Result<u8, BytesReadError> {
7788325f54SHarlanC         let mut cursor = self.advance_bytes_cursor(1)?;
7888325f54SHarlanC         Ok(cursor.read_u8()?)
7988325f54SHarlanC     }
8088325f54SHarlanC 
read_u16<T: ByteOrder>(&mut self) -> Result<u16, BytesReadError>8188325f54SHarlanC     pub fn read_u16<T: ByteOrder>(&mut self) -> Result<u16, BytesReadError> {
8288325f54SHarlanC         let mut cursor = self.read_bytes_cursor(2)?;
8388325f54SHarlanC         let val = cursor.read_u16::<T>()?;
8488325f54SHarlanC         Ok(val)
8588325f54SHarlanC     }
8688325f54SHarlanC 
read_u24<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError>8788325f54SHarlanC     pub fn read_u24<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError> {
8888325f54SHarlanC         let mut cursor = self.read_bytes_cursor(3)?;
8988325f54SHarlanC         let val = cursor.read_u24::<T>()?;
9088325f54SHarlanC         Ok(val)
9188325f54SHarlanC     }
9288325f54SHarlanC 
advance_u24<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError>9388325f54SHarlanC     pub fn advance_u24<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError> {
9488325f54SHarlanC         let mut cursor = self.advance_bytes_cursor(3)?;
9588325f54SHarlanC         Ok(cursor.read_u24::<T>()?)
9688325f54SHarlanC     }
9788325f54SHarlanC 
read_u32<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError>9888325f54SHarlanC     pub fn read_u32<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError> {
9988325f54SHarlanC         let mut cursor = self.read_bytes_cursor(4)?;
10088325f54SHarlanC         let val = cursor.read_u32::<T>()?;
10188325f54SHarlanC 
10288325f54SHarlanC         Ok(val)
10388325f54SHarlanC     }
10488325f54SHarlanC 
read_u48<T: ByteOrder>(&mut self) -> Result<u64, BytesReadError>105*06c50324SHarlan     pub fn read_u48<T: ByteOrder>(&mut self) -> Result<u64, BytesReadError> {
106*06c50324SHarlan         let mut cursor = self.read_bytes_cursor(6)?;
107*06c50324SHarlan         let val = cursor.read_u48::<T>()?;
108*06c50324SHarlan 
109*06c50324SHarlan         Ok(val)
110*06c50324SHarlan     }
111*06c50324SHarlan 
read_f64<T: ByteOrder>(&mut self) -> Result<f64, BytesReadError>11288325f54SHarlanC     pub fn read_f64<T: ByteOrder>(&mut self) -> Result<f64, BytesReadError> {
11388325f54SHarlanC         let mut cursor = self.read_bytes_cursor(8)?;
11488325f54SHarlanC         let val = cursor.read_f64::<T>()?;
11588325f54SHarlanC 
11688325f54SHarlanC         Ok(val)
11788325f54SHarlanC     }
11888325f54SHarlanC 
read_u64<T: ByteOrder>(&mut self) -> Result<u64, BytesReadError>1198e71d710SHarlan     pub fn read_u64<T: ByteOrder>(&mut self) -> Result<u64, BytesReadError> {
1208e71d710SHarlan         let mut cursor = self.read_bytes_cursor(8)?;
1218e71d710SHarlan         let val = cursor.read_u64::<T>()?;
1228e71d710SHarlan 
1238e71d710SHarlan         Ok(val)
1248e71d710SHarlan     }
1258e71d710SHarlan 
get(&self, index: usize) -> Result<u8, BytesReadError>126c4a586d9SHarlan     pub fn get(&self, index: usize) -> Result<u8, BytesReadError> {
127a4440553SHarlanC         if index >= self.len() {
128a4440553SHarlanC             return Err(BytesReadError {
129a4440553SHarlanC                 value: BytesReadErrorValue::IndexOutofRange,
130a4440553SHarlanC             });
131a4440553SHarlanC         }
132a4440553SHarlanC 
13385c0af6aSLuca Barbato         Ok(*self.buffer.get(index).unwrap())
134a4440553SHarlanC     }
135a4440553SHarlanC 
len(&self) -> usize136c4a586d9SHarlan     pub fn len(&self) -> usize {
13785c0af6aSLuca Barbato         self.buffer.len()
13888325f54SHarlanC     }
13988325f54SHarlanC 
is_empty(&self) -> bool140c4a586d9SHarlan     pub fn is_empty(&self) -> bool {
141c4a586d9SHarlan         self.len() == 0
142c4a586d9SHarlan     }
143c4a586d9SHarlan 
extract_remaining_bytes(&mut self) -> BytesMut14488325f54SHarlanC     pub fn extract_remaining_bytes(&mut self) -> BytesMut {
14585c0af6aSLuca Barbato         self.buffer.split_to(self.buffer.len())
14688325f54SHarlanC     }
get_remaining_bytes(&self) -> BytesMut147c4a586d9SHarlan     pub fn get_remaining_bytes(&self) -> BytesMut {
14885c0af6aSLuca Barbato         self.buffer.clone()
14988325f54SHarlanC     }
15088325f54SHarlanC }
1518e71d710SHarlan pub struct AsyncBytesReader<T1: TNetIO> {
1528e71d710SHarlan     pub bytes_reader: BytesReader,
1538e71d710SHarlan     pub io: Arc<Mutex<T1>>,
1548e71d710SHarlan }
1558e71d710SHarlan 
1568e71d710SHarlan impl<T1> AsyncBytesReader<T1>
1578e71d710SHarlan where
1588e71d710SHarlan     T1: TNetIO,
1598e71d710SHarlan {
new(io: Arc<Mutex<T1>>) -> Self1608e71d710SHarlan     pub fn new(io: Arc<Mutex<T1>>) -> Self {
1618e71d710SHarlan         Self {
1628e71d710SHarlan             bytes_reader: BytesReader::new(BytesMut::default()),
1638e71d710SHarlan             io,
1648e71d710SHarlan         }
1658e71d710SHarlan     }
1668e71d710SHarlan 
read(&mut self) -> Result<(), BytesReadError>1678e71d710SHarlan     pub async fn read(&mut self) -> Result<(), BytesReadError> {
1688e71d710SHarlan         let data = self.io.lock().await.read().await?;
1698e71d710SHarlan         self.bytes_reader.extend_from_slice(&data[..]);
1708e71d710SHarlan         Ok(())
1718e71d710SHarlan     }
1728e71d710SHarlan 
check(&mut self, bytes_num: usize) -> Result<(), BytesReadError>1738e71d710SHarlan     async fn check(&mut self, bytes_num: usize) -> Result<(), BytesReadError> {
1748e71d710SHarlan         while self.bytes_reader.len() < bytes_num {
1758e71d710SHarlan             self.read().await?;
1768e71d710SHarlan         }
1778e71d710SHarlan 
1788e71d710SHarlan         Ok(())
1798e71d710SHarlan     }
1808e71d710SHarlan 
read_bytes(&mut self, bytes_num: usize) -> Result<BytesMut, BytesReadError>1818e71d710SHarlan     pub async fn read_bytes(&mut self, bytes_num: usize) -> Result<BytesMut, BytesReadError> {
1828e71d710SHarlan         self.check(bytes_num).await?;
1838e71d710SHarlan         self.bytes_reader.read_bytes(bytes_num)
1848e71d710SHarlan     }
1858e71d710SHarlan 
advance_bytes(&mut self, bytes_num: usize) -> Result<BytesMut, BytesReadError>1868e71d710SHarlan     pub async fn advance_bytes(&mut self, bytes_num: usize) -> Result<BytesMut, BytesReadError> {
1878e71d710SHarlan         self.check(bytes_num).await?;
1888e71d710SHarlan         self.bytes_reader.advance_bytes(bytes_num)
1898e71d710SHarlan     }
1908e71d710SHarlan 
read_bytes_cursor( &mut self, bytes_num: usize, ) -> Result<Cursor<BytesMut>, BytesReadError>1918e71d710SHarlan     pub async fn read_bytes_cursor(
1928e71d710SHarlan         &mut self,
1938e71d710SHarlan         bytes_num: usize,
1948e71d710SHarlan     ) -> Result<Cursor<BytesMut>, BytesReadError> {
1958e71d710SHarlan         self.check(bytes_num).await?;
1968e71d710SHarlan         self.bytes_reader.read_bytes_cursor(bytes_num)
1978e71d710SHarlan     }
1988e71d710SHarlan 
advance_bytes_cursor( &mut self, bytes_num: usize, ) -> Result<Cursor<BytesMut>, BytesReadError>1998e71d710SHarlan     pub async fn advance_bytes_cursor(
2008e71d710SHarlan         &mut self,
2018e71d710SHarlan         bytes_num: usize,
2028e71d710SHarlan     ) -> Result<Cursor<BytesMut>, BytesReadError> {
2038e71d710SHarlan         self.check(bytes_num).await?;
2048e71d710SHarlan         self.bytes_reader.advance_bytes_cursor(bytes_num)
2058e71d710SHarlan     }
2068e71d710SHarlan 
read_u8(&mut self) -> Result<u8, BytesReadError>2078e71d710SHarlan     pub async fn read_u8(&mut self) -> Result<u8, BytesReadError> {
2088e71d710SHarlan         self.check(1).await?;
2098e71d710SHarlan         self.bytes_reader.read_u8()
2108e71d710SHarlan     }
2118e71d710SHarlan 
advance_u8(&mut self) -> Result<u8, BytesReadError>2128e71d710SHarlan     pub async fn advance_u8(&mut self) -> Result<u8, BytesReadError> {
2138e71d710SHarlan         self.check(1).await?;
2148e71d710SHarlan         self.bytes_reader.advance_u8()
2158e71d710SHarlan     }
2168e71d710SHarlan 
read_u16<T: ByteOrder>(&mut self) -> Result<u16, BytesReadError>2178e71d710SHarlan     pub async fn read_u16<T: ByteOrder>(&mut self) -> Result<u16, BytesReadError> {
2188e71d710SHarlan         self.check(2).await?;
2198e71d710SHarlan         self.bytes_reader.read_u16::<T>()
2208e71d710SHarlan     }
2218e71d710SHarlan 
read_u24<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError>2228e71d710SHarlan     pub async fn read_u24<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError> {
2238e71d710SHarlan         self.check(3).await?;
2248e71d710SHarlan         self.bytes_reader.read_u24::<T>()
2258e71d710SHarlan     }
2268e71d710SHarlan 
advance_u24<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError>2278e71d710SHarlan     pub async fn advance_u24<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError> {
2288e71d710SHarlan         self.check(3).await?;
2298e71d710SHarlan         self.bytes_reader.advance_u24::<T>()
2308e71d710SHarlan     }
2318e71d710SHarlan 
read_u32<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError>2328e71d710SHarlan     pub async fn read_u32<T: ByteOrder>(&mut self) -> Result<u32, BytesReadError> {
2338e71d710SHarlan         self.check(4).await?;
2348e71d710SHarlan         self.bytes_reader.read_u32::<T>()
2358e71d710SHarlan     }
2368e71d710SHarlan 
read_f64<T: ByteOrder>(&mut self) -> Result<f64, BytesReadError>2378e71d710SHarlan     pub async fn read_f64<T: ByteOrder>(&mut self) -> Result<f64, BytesReadError> {
2388e71d710SHarlan         self.check(8).await?;
2398e71d710SHarlan         self.bytes_reader.read_f64::<T>()
2408e71d710SHarlan     }
2418e71d710SHarlan }
24288325f54SHarlanC 
24388325f54SHarlanC #[cfg(test)]
24488325f54SHarlanC mod tests {
24588325f54SHarlanC 
24688325f54SHarlanC     use super::BytesReader;
24788325f54SHarlanC     use bytes::BytesMut;
24888325f54SHarlanC     use std::cell::RefCell;
24988325f54SHarlanC     use std::rc::Rc;
25088325f54SHarlanC 
25188325f54SHarlanC     #[test]
test_rc_refcell()25288325f54SHarlanC     fn test_rc_refcell() {
25388325f54SHarlanC         let reader = Rc::new(RefCell::new(BytesReader::new(BytesMut::new())));
25488325f54SHarlanC         let xs: [u8; 3] = [1, 2, 3];
25588325f54SHarlanC         reader.borrow_mut().extend_from_slice(&xs[..]);
25688325f54SHarlanC 
25788325f54SHarlanC         let mut rv = reader.borrow_mut().read_u8().unwrap();
25888325f54SHarlanC         assert_eq!(rv, 1, "Incorrect value");
25988325f54SHarlanC 
26088325f54SHarlanC         rv = reader.borrow_mut().read_u8().unwrap();
26188325f54SHarlanC         assert_eq!(rv, 2, "Incorrect value");
26288325f54SHarlanC 
26388325f54SHarlanC         rv = reader.borrow_mut().read_u8().unwrap();
26488325f54SHarlanC         assert_eq!(rv, 3, "Incorrect value");
26588325f54SHarlanC     }
26688325f54SHarlanC 
26788325f54SHarlanC     struct RefStruct {
26888325f54SHarlanC         pub reader: Rc<RefCell<BytesReader>>,
26988325f54SHarlanC     }
27088325f54SHarlanC 
27188325f54SHarlanC     impl RefStruct {
new(reader: Rc<RefCell<BytesReader>>) -> Self27288325f54SHarlanC         pub fn new(reader: Rc<RefCell<BytesReader>>) -> Self {
27385c0af6aSLuca Barbato             Self { reader }
27488325f54SHarlanC         }
27588325f54SHarlanC 
27688325f54SHarlanC         // pub fn read_u8(&mut self) -> u8 {
27788325f54SHarlanC         //     return self.reader.borrow_mut().read_u8().unwrap();
27888325f54SHarlanC         // }
27988325f54SHarlanC 
extend_from_slice(&mut self, data: &[u8])28088325f54SHarlanC         pub fn extend_from_slice(&mut self, data: &[u8]) {
28188325f54SHarlanC             self.reader.borrow_mut().extend_from_slice(data);
28288325f54SHarlanC         }
28388325f54SHarlanC     }
28488325f54SHarlanC 
28588325f54SHarlanC     #[test]
test_struct_rc_refcell()28688325f54SHarlanC     fn test_struct_rc_refcell() {
28788325f54SHarlanC         let reader = Rc::new(RefCell::new(BytesReader::new(BytesMut::new())));
28888325f54SHarlanC 
28988325f54SHarlanC         let mut ref_struct = RefStruct::new(reader);
29088325f54SHarlanC 
29188325f54SHarlanC         let xs: [u8; 3] = [1, 2, 3];
29288325f54SHarlanC         ref_struct.extend_from_slice(&xs);
29388325f54SHarlanC 
29488325f54SHarlanC         let mut reader = ref_struct.reader.borrow_mut();
29588325f54SHarlanC 
29688325f54SHarlanC         let mut rv = reader.read_u8().unwrap();
29788325f54SHarlanC         assert_eq!(rv, 1, "Incorrect value");
29888325f54SHarlanC 
29988325f54SHarlanC         rv = reader.read_u8().unwrap();
30088325f54SHarlanC         assert_eq!(rv, 2, "Incorrect value");
30188325f54SHarlanC 
30288325f54SHarlanC         rv = reader.read_u8().unwrap();
30388325f54SHarlanC         assert_eq!(rv, 3, "Incorrect value");
30488325f54SHarlanC     }
30588325f54SHarlanC }
306