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