paper_utils/stream/
reader.rs1use 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}