handy_async/
sync_io.rs

1//! Synchronous I/O functionalities.
2
3use std::io::{Result, Read, Write, Error, ErrorKind};
4use byteorder::{BigEndian, LittleEndian, ReadBytesExt, WriteBytesExt};
5
6/// An extention of the standard `Read` trait.
7pub trait ReadExt: Read {
8    /// Reads a 8-bit unsigned integer.
9    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    /// Reads a big-endian 16-bit unsigned integer.
16    fn read_u16be(&mut self) -> Result<u16> {
17        self.read_u16::<BigEndian>()
18    }
19
20    /// Reads a little-endian 16-bit unsigned integer.
21    fn read_u16le(&mut self) -> Result<u16> {
22        self.read_u16::<LittleEndian>()
23    }
24
25    /// Reads a big-endian 24-bit unsigned integer.
26    fn read_u24be(&mut self) -> Result<u32> {
27        self.read_uint::<BigEndian>(3).map(|n| n as u32)
28    }
29
30    /// Reads a little-endian 24-bit unsigned integer.
31    fn read_u24le(&mut self) -> Result<u32> {
32        self.read_uint::<LittleEndian>(3).map(|n| n as u32)
33    }
34
35    /// Reads a big-endian 32-bit unsigned integer.
36    fn read_u32be(&mut self) -> Result<u32> {
37        self.read_u32::<BigEndian>()
38    }
39
40    /// Reads a little-endian 32-bit unsigned integer.
41    fn read_u32le(&mut self) -> Result<u32> {
42        self.read_u32::<LittleEndian>()
43    }
44
45    /// Reads a big-endian 40-bit unsigned integer.
46    fn read_u40be(&mut self) -> Result<u64> {
47        self.read_uint::<BigEndian>(5)
48    }
49
50    /// Reads a little-endian 40-bit unsigned integer.
51    fn read_u40le(&mut self) -> Result<u64> {
52        self.read_uint::<LittleEndian>(5)
53    }
54
55    /// Reads a big-endian 48-bit unsigned integer.
56    fn read_u48be(&mut self) -> Result<u64> {
57        self.read_uint::<BigEndian>(6)
58    }
59
60    /// Reads a little-endian 48-bit unsigned integer.
61    fn read_u48le(&mut self) -> Result<u64> {
62        self.read_uint::<LittleEndian>(6)
63    }
64
65    /// Reads a big-endian 56-bit unsigned integer.
66    fn read_u56be(&mut self) -> Result<u64> {
67        self.read_uint::<BigEndian>(7)
68    }
69
70    /// Reads a little-endian 56-bit unsigned integer.
71    fn read_u56le(&mut self) -> Result<u64> {
72        self.read_uint::<LittleEndian>(7)
73    }
74
75    /// Reads a big-endian 64-bit unsigned integer.
76    fn read_u64be(&mut self) -> Result<u64> {
77        self.read_u64::<BigEndian>()
78    }
79
80    /// Reads a little-endian 64-bit unsigned integer.
81    fn read_u64le(&mut self) -> Result<u64> {
82        self.read_u64::<LittleEndian>()
83    }
84
85    /// Reads string.
86    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    /// Reads bytes.
95    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    /// Reads all string.
102    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    /// Reads all bytes.
109    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
117/// An extention of the standard `Write` trait.
118pub trait WriteExt: Write {
119    /// Writes a 8-bit unsigned integer.
120    fn write_u8(&mut self, n: u8) -> Result<()> {
121        self.write_all(&[n][..])?;
122        Ok(())
123    }
124
125    /// Writes a big-endian 16-bit integer.
126    fn write_u16be(&mut self, n: u16) -> Result<()> {
127        self.write_u16::<BigEndian>(n)
128    }
129
130    /// Writes a little-endian 16-bit integer.
131    fn write_u16le(&mut self, n: u16) -> Result<()> {
132        self.write_u16::<LittleEndian>(n)
133    }
134
135    /// Writes a big-endian 24-bit integer.
136    fn write_u24be(&mut self, n: u32) -> Result<()> {
137        self.write_uint::<BigEndian>(u64::from(n), 3)
138    }
139
140    /// Writes a little-endian 24-bit integer.
141    fn write_u24le(&mut self, n: u32) -> Result<()> {
142        self.write_uint::<LittleEndian>(u64::from(n), 3)
143    }
144
145    /// Writes a big-endian 32-bit integer.
146    fn write_u32be(&mut self, n: u32) -> Result<()> {
147        self.write_u32::<BigEndian>(n)
148    }
149
150    /// Writes a little-endian 32-bit integer.
151    fn write_u32le(&mut self, n: u32) -> Result<()> {
152        self.write_u32::<LittleEndian>(n)
153    }
154
155    /// Writes a big-endian 40-bit integer.
156    fn write_u40be(&mut self, n: u64) -> Result<()> {
157        self.write_uint::<BigEndian>(n, 5)
158    }
159
160    /// Writes a little-endian 40-bit integer.
161    fn write_u40le(&mut self, n: u64) -> Result<()> {
162        self.write_uint::<LittleEndian>(n, 5)
163    }
164
165    /// Writes a big-endian 48-bit integer.
166    fn write_u48be(&mut self, n: u64) -> Result<()> {
167        self.write_uint::<BigEndian>(n, 6)
168    }
169
170    /// Writes a little-endian 48-bit integer.
171    fn write_u48le(&mut self, n: u64) -> Result<()> {
172        self.write_uint::<LittleEndian>(n, 6)
173    }
174
175    /// Writes a big-endian 56-bit integer.
176    fn write_u56be(&mut self, n: u64) -> Result<()> {
177        self.write_uint::<BigEndian>(n, 7)
178    }
179
180    /// Writes a little-endian 56-bit integer.
181    fn write_u56le(&mut self, n: u64) -> Result<()> {
182        self.write_uint::<LittleEndian>(n, 7)
183    }
184
185    /// Writes a big-endian 64-bit integer.
186    fn write_u64be(&mut self, n: u64) -> Result<()> {
187        self.write_u64::<BigEndian>(n)
188    }
189
190    /// Writes a little-endian 64-bit integer.
191    fn write_u64le(&mut self, n: u64) -> Result<()> {
192        self.write_u64::<LittleEndian>(n)
193    }
194}
195impl<W: Write> WriteExt for W {}