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