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