paper_utils/stream/
reader.rs

1/*
2 * Copyright (c) Kia Shakiba
3 *
4 * This source code is licensed under the GNU AGPLv3 license found in the
5 * LICENSE file in the root directory of this source tree.
6 */
7
8use std::{
9	io::Cursor,
10	net::TcpStream,
11};
12
13use byteorder::{LittleEndian, ReadBytesExt};
14use crate::stream::{Buffer, StreamError, read_buf, read_stack_buf};
15
16pub const TRUE_INDICATOR: u8 = 33;
17pub const FALSE_INDICATOR: u8 = 63;
18
19pub struct StreamReader<'a> {
20	stream: &'a mut TcpStream,
21}
22
23impl<'a> StreamReader<'a> {
24	pub fn new(stream: &'a mut TcpStream) -> Self {
25		StreamReader {
26			stream,
27		}
28	}
29
30	pub fn read_bool(&mut self) -> Result<bool, StreamError> {
31		let buf = read_stack_buf::<1>(self.stream)?;
32
33		match buf[0] {
34			TRUE_INDICATOR => Ok(true),
35			FALSE_INDICATOR => Ok(false),
36
37			_ => Err(StreamError::InvalidData),
38		}
39	}
40
41	pub fn read_u8(&mut self) -> Result<u8, StreamError> {
42		let buf = read_stack_buf::<1>(self.stream)?;
43		Ok(buf[0])
44	}
45
46	pub fn read_u16(&mut self) -> Result<u16, StreamError> {
47		let buf = read_stack_buf::<2>(self.stream)?;
48		let mut rdr = Cursor::new(buf);
49
50		rdr.read_u16::<LittleEndian>().map_err(|_| StreamError::InvalidData)
51	}
52
53	pub fn read_u32(&mut self) -> Result<u32, StreamError> {
54		let buf = read_stack_buf::<4>(self.stream)?;
55		let mut rdr = Cursor::new(buf);
56
57		rdr.read_u32::<LittleEndian>().map_err(|_| StreamError::InvalidData)
58	}
59
60	pub fn read_u64(&mut self) -> Result<u64, StreamError> {
61		let buf = read_stack_buf::<8>(self.stream)?;
62		let mut rdr = Cursor::new(buf);
63
64		rdr.read_u64::<LittleEndian>().map_err(|_| StreamError::InvalidData)
65	}
66
67	pub fn read_f32(&mut self) -> Result<f32, StreamError> {
68		let buf = read_stack_buf::<4>(self.stream)?;
69		let mut rdr = Cursor::new(buf);
70
71		rdr.read_f32::<LittleEndian>().map_err(|_| StreamError::InvalidData)
72	}
73
74	pub fn read_f64(&mut self) -> Result<f64, StreamError> {
75		let buf = read_stack_buf::<8>(self.stream)?;
76		let mut rdr = Cursor::new(buf);
77
78		rdr.read_f64::<LittleEndian>().map_err(|_| StreamError::InvalidData)
79	}
80
81	pub fn read_buf(&mut self) -> Result<Buffer, StreamError> {
82		let size = self.read_u32()? as usize;
83		read_buf(self.stream, size)
84	}
85
86	pub fn read_string(&mut self) -> Result<String, StreamError> {
87		let size = self.read_u32()? as usize;
88		let buf = read_buf(self.stream, size)?;
89
90		String::from_utf8(buf.to_vec()).map_err(|_| StreamError::InvalidData)
91	}
92}