reader_writer/
reader.rs

1use std;
2use std::io::{Read, Error, ErrorKind};
3
4pub trait Reader {
5    fn read_u8(&mut self) -> std::io::Result<Option<u8>>;
6    fn read_u16(&mut self) -> std::io::Result<Option<u16>>;
7    fn read_u32(&mut self) -> std::io::Result<Option<u32>>;
8    fn read_u64(&mut self) -> std::io::Result<Option<u64>>;
9    fn read_bytes(&mut self, buf: &mut [u8]) -> std::io::Result<usize>;
10    fn read_string(&mut self) -> std::io::Result<Option<String>>;
11}
12
13pub struct BasicReader<'a> {
14    read: &'a mut Read
15}
16
17impl<'a> BasicReader<'a> {
18    pub fn new(read: &'a mut Read) -> BasicReader {
19        BasicReader {
20            read: read
21        }
22    }
23}
24
25impl<'a> Reader for BasicReader<'a> {
26    fn read_u8(&mut self) -> std::io::Result<Option<u8>> {
27        let mut buf = [0];
28        match self.read.read(&mut buf[..]) {
29            Ok(1) => Ok(Some(buf[0])),
30            Ok(_) => Ok(None),
31            Err(err) => {
32                return Err(err)
33            }
34        }
35    }
36
37    fn read_u16(&mut self) -> std::io::Result<Option<u16>> {
38        let mut buf = [0; 2];
39        match self.read.read(&mut buf[..]) {
40            Ok(2) => {
41                let a = (buf[0] as u16) << 8;
42                let b = buf[1] as u16;
43                Ok(Some(a | b))
44            },
45            Ok(_) => Ok(None),
46            Err(err) => {
47                Err(err)
48            }
49        }
50    }
51
52    fn read_u32(&mut self) -> std::io::Result<Option<u32>> {
53        let mut buf = [0; 4];
54        match self.read.read(&mut buf[..]) {
55            Ok(4) => {
56                let a = (buf[0] as u32) << 24;
57                let b = (buf[1] as u32) << 16;
58                let c = (buf[2] as u32) << 8;
59                let d = buf[3] as u32;
60                Ok(Some(a | b | c | d))
61            },
62            Ok(_) => Ok(None),
63            Err(err) => {
64                Err(err)
65            }
66        }
67    }
68
69    fn read_u64(&mut self) -> std::io::Result<Option<u64>> {
70        let mut buf = [0; 8];
71        match self.read.read(&mut buf[..]) {
72            Ok(8) => {
73                let a = (buf[0] as u64) << 56;
74                let b = (buf[1] as u64) << 48;
75                let c = (buf[2] as u64) << 40;
76                let d = (buf[3] as u64) << 32;
77                let e = (buf[4] as u64) << 24;
78                let f = (buf[5] as u64) << 16;
79                let g = (buf[6] as u64) << 8;
80                let h = buf[7] as u64;
81                Ok(Some(a | b | c | d | e | f | g | h))
82            },
83            Ok(_) => Ok(None),
84            Err(err) => {
85                Err(err)
86            }
87        }
88    }
89
90    fn read_bytes(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
91        self.read.read(buf)
92    }
93
94    fn read_string(&mut self) -> std::io::Result<Option<String>> {
95        let len = match try!(self.read_u16()) {
96            Some(len) => len as usize,
97            None => {
98                return Ok(None)
99            }
100        };
101        let mut buf = vec![0 as u8; len];
102        let n = try!(self.read_bytes(&mut buf[..]));
103        if n != len {
104            return Ok(None)
105        }
106        let s = match String::from_utf8(buf) {
107            Ok(s) => s,
108            Err(err) => {
109                return Err(Error::new(ErrorKind::Other, format!("encoding error: {}", err)))
110            }
111        };
112        return Ok(Some(s))
113    }
114}
115