reader_writer/
writer.rs

1use std;
2use std::io::{Write, Error, ErrorKind};
3
4pub trait Writer {
5    fn write_u8(&mut self, v: u8) -> std::io::Result<()>;
6    fn write_u16(&mut self, v: u16) -> std::io::Result<()>;
7    fn write_u32(&mut self, v: u32) -> std::io::Result<()>;
8    fn write_u64(&mut self, v: u64) -> std::io::Result<()>;
9    fn write_bytes(&mut self, v: &[u8]) -> std::io::Result<()>;
10    fn write_str(&mut self, v: &str) -> std::io::Result<()>;
11    fn write_string(&mut self, v: &String) -> std::io::Result<()>;
12}
13
14pub struct CountWriter {
15    count: usize
16}
17
18impl CountWriter {
19    pub fn new() -> CountWriter {
20        CountWriter {
21            count: 0
22        }
23    }
24
25    pub fn count(&self) -> usize {
26        return self.count
27    }
28}
29
30impl Writer for CountWriter {
31    fn write_u8(&mut self,  _: u8) -> std::io::Result<()> {
32        self.count += 1;
33        Ok(())
34    }
35
36    fn write_u16(&mut self, _: u16) -> std::io::Result<()> {
37        self.count += 2;
38        Ok(())
39    }
40
41    fn write_u32(&mut self, _: u32) -> std::io::Result<()> {
42        self.count += 4;
43        Ok(())
44    }
45
46    fn write_u64(&mut self, _: u64) -> std::io::Result<()> {
47        self.count += 8;
48        Ok(())
49    }
50
51    fn write_bytes(&mut self, v: &[u8]) -> std::io::Result<()> {
52        self.count += v.len();
53        Ok(())
54    }
55
56    fn write_str(&mut self, v: &str) -> std::io::Result<()> {
57        self.count += 2 + v.len();
58        Ok(())
59    }
60
61    fn write_string(&mut self, v: &String) -> std::io::Result<()> {
62        match std::str::from_utf8(v.as_bytes()) {
63            Ok(s) => self.write_str(s),
64            Err(err) => {
65                Err(Error::new(ErrorKind::Other, format!("encoding error: {}", err)))
66            }
67        }
68    }
69}
70
71pub struct BasicWriter<'a> {
72    write: &'a mut Write
73}
74
75impl<'a> BasicWriter<'a> {
76    pub fn new(write: &mut Write) -> BasicWriter {
77        BasicWriter {
78            write: write
79        }
80    }
81}
82
83impl<'a> Writer for BasicWriter<'a> {
84    fn write_u8(&mut self, v: u8) -> std::io::Result<()> {
85        self.write.write_all(&[v])
86    }
87
88    fn write_u16(&mut self, v: u16) -> std::io::Result<()> {
89        self.write.write_all(&[(v >> 8) as u8, (v & 0xff) as u8])
90    }
91
92    fn write_u32(&mut self, v: u32) -> std::io::Result<()> {
93        self.write.write_all(&[
94            (v >> 24) as u8,
95            ((v >> 16) & 0xff) as u8,
96            ((v >> 8) & 0xff) as u8,
97            (v & 0xff) as u8
98        ])
99    }
100
101    fn write_u64(&mut self, v: u64) -> std::io::Result<()> {
102        self.write.write_all(&[
103            (v >> 56) as u8,
104            ((v >> 48) & 0xff) as u8,
105            ((v >> 40) & 0xff) as u8,
106            ((v >> 32) & 0xff) as u8,
107            ((v >> 24) & 0xff) as u8,
108            ((v >> 16) & 0xff) as u8,
109            ((v >> 8) & 0xff) as u8,
110            (v & 0xff) as u8
111        ])
112    }
113
114    fn write_bytes(&mut self, buf: &[u8]) -> std::io::Result<()> {
115        self.write.write_all(buf)
116    }
117
118    fn write_str(&mut self, buf: &str) -> std::io::Result<()> {
119        try!(self.write_u16(buf.len() as u16));
120        self.write_bytes(buf.as_bytes())
121    }
122
123    fn write_string(&mut self, v: &String) -> std::io::Result<()> {
124        match std::str::from_utf8(v.as_bytes()) {
125            Ok(s) => self.write_str(s),
126            Err(err) => {
127                Err(Error::new(ErrorKind::Other, format!("encoding error: {}", err)))
128            }
129        }
130    }
131}
132