1use std::io::{Result, Read, Write, Error, ErrorKind};
4use byteorder::{BigEndian, LittleEndian, ReadBytesExt, WriteBytesExt};
5
6pub trait ReadExt: Read {
8 fn read_u8(&mut self) -> Result<u8> {
10 let mut buf = [0; 1];
11 self.read_exact(&mut buf)?;
12 Ok(buf[0])
13 }
14
15 fn read_u16be(&mut self) -> Result<u16> {
17 self.read_u16::<BigEndian>()
18 }
19
20 fn read_u16le(&mut self) -> Result<u16> {
22 self.read_u16::<LittleEndian>()
23 }
24
25 fn read_u24be(&mut self) -> Result<u32> {
27 self.read_uint::<BigEndian>(3).map(|n| n as u32)
28 }
29
30 fn read_u24le(&mut self) -> Result<u32> {
32 self.read_uint::<LittleEndian>(3).map(|n| n as u32)
33 }
34
35 fn read_u32be(&mut self) -> Result<u32> {
37 self.read_u32::<BigEndian>()
38 }
39
40 fn read_u32le(&mut self) -> Result<u32> {
42 self.read_u32::<LittleEndian>()
43 }
44
45 fn read_u40be(&mut self) -> Result<u64> {
47 self.read_uint::<BigEndian>(5)
48 }
49
50 fn read_u40le(&mut self) -> Result<u64> {
52 self.read_uint::<LittleEndian>(5)
53 }
54
55 fn read_u48be(&mut self) -> Result<u64> {
57 self.read_uint::<BigEndian>(6)
58 }
59
60 fn read_u48le(&mut self) -> Result<u64> {
62 self.read_uint::<LittleEndian>(6)
63 }
64
65 fn read_u56be(&mut self) -> Result<u64> {
67 self.read_uint::<BigEndian>(7)
68 }
69
70 fn read_u56le(&mut self) -> Result<u64> {
72 self.read_uint::<LittleEndian>(7)
73 }
74
75 fn read_u64be(&mut self) -> Result<u64> {
77 self.read_u64::<BigEndian>()
78 }
79
80 fn read_u64le(&mut self) -> Result<u64> {
82 self.read_u64::<LittleEndian>()
83 }
84
85 fn read_string(&mut self, length: usize) -> Result<String> {
87 let bytes = self.read_bytes(length)?;
88 let string = String::from_utf8(bytes).map_err(|e| {
89 Error::new(ErrorKind::InvalidData, e)
90 })?;
91 Ok(string)
92 }
93
94 fn read_bytes(&mut self, length: usize) -> Result<Vec<u8>> {
96 let mut buf = vec![0; length];
97 self.read_exact(&mut buf)?;
98 Ok(buf)
99 }
100
101 fn read_all_string(&mut self) -> Result<String> {
103 let mut buf = String::new();
104 self.read_to_string(&mut buf)?;
105 Ok(buf)
106 }
107
108 fn read_all_bytes(&mut self) -> Result<Vec<u8>> {
110 let mut buf = Vec::new();
111 self.read_to_end(&mut buf)?;
112 Ok(buf)
113 }
114}
115impl<R: Read> ReadExt for R {}
116
117pub trait WriteExt: Write {
119 fn write_u8(&mut self, n: u8) -> Result<()> {
121 self.write_all(&[n][..])?;
122 Ok(())
123 }
124
125 fn write_u16be(&mut self, n: u16) -> Result<()> {
127 self.write_u16::<BigEndian>(n)
128 }
129
130 fn write_u16le(&mut self, n: u16) -> Result<()> {
132 self.write_u16::<LittleEndian>(n)
133 }
134
135 fn write_u24be(&mut self, n: u32) -> Result<()> {
137 self.write_uint::<BigEndian>(u64::from(n), 3)
138 }
139
140 fn write_u24le(&mut self, n: u32) -> Result<()> {
142 self.write_uint::<LittleEndian>(u64::from(n), 3)
143 }
144
145 fn write_u32be(&mut self, n: u32) -> Result<()> {
147 self.write_u32::<BigEndian>(n)
148 }
149
150 fn write_u32le(&mut self, n: u32) -> Result<()> {
152 self.write_u32::<LittleEndian>(n)
153 }
154
155 fn write_u40be(&mut self, n: u64) -> Result<()> {
157 self.write_uint::<BigEndian>(n, 5)
158 }
159
160 fn write_u40le(&mut self, n: u64) -> Result<()> {
162 self.write_uint::<LittleEndian>(n, 5)
163 }
164
165 fn write_u48be(&mut self, n: u64) -> Result<()> {
167 self.write_uint::<BigEndian>(n, 6)
168 }
169
170 fn write_u48le(&mut self, n: u64) -> Result<()> {
172 self.write_uint::<LittleEndian>(n, 6)
173 }
174
175 fn write_u56be(&mut self, n: u64) -> Result<()> {
177 self.write_uint::<BigEndian>(n, 7)
178 }
179
180 fn write_u56le(&mut self, n: u64) -> Result<()> {
182 self.write_uint::<LittleEndian>(n, 7)
183 }
184
185 fn write_u64be(&mut self, n: u64) -> Result<()> {
187 self.write_u64::<BigEndian>(n)
188 }
189
190 fn write_u64le(&mut self, n: u64) -> Result<()> {
192 self.write_u64::<LittleEndian>(n)
193 }
194}
195impl<W: Write> WriteExt for W {}