wow_m2/
io_ext.rs

1use std::io::{Read, Result, Write};
2
3/// Extension trait for reading little-endian values from a reader
4pub trait ReadExt: Read {
5    fn read_u8(&mut self) -> Result<u8> {
6        let mut buf = [0u8; 1];
7        self.read_exact(&mut buf)?;
8        Ok(buf[0])
9    }
10
11    fn read_u16_le(&mut self) -> Result<u16> {
12        let mut buf = [0u8; 2];
13        self.read_exact(&mut buf)?;
14        Ok(u16::from_le_bytes(buf))
15    }
16
17    fn read_u32_le(&mut self) -> Result<u32> {
18        let mut buf = [0u8; 4];
19        self.read_exact(&mut buf)?;
20        Ok(u32::from_le_bytes(buf))
21    }
22
23    fn read_u64_le(&mut self) -> Result<u64> {
24        let mut buf = [0u8; 8];
25        self.read_exact(&mut buf)?;
26        Ok(u64::from_le_bytes(buf))
27    }
28
29    fn read_i8(&mut self) -> Result<i8> {
30        let mut buf = [0u8; 1];
31        self.read_exact(&mut buf)?;
32        Ok(i8::from_le_bytes(buf))
33    }
34
35    fn read_i16_le(&mut self) -> Result<i16> {
36        let mut buf = [0u8; 2];
37        self.read_exact(&mut buf)?;
38        Ok(i16::from_le_bytes(buf))
39    }
40
41    fn read_i32_le(&mut self) -> Result<i32> {
42        let mut buf = [0u8; 4];
43        self.read_exact(&mut buf)?;
44        Ok(i32::from_le_bytes(buf))
45    }
46
47    fn read_i64_le(&mut self) -> Result<i64> {
48        let mut buf = [0u8; 8];
49        self.read_exact(&mut buf)?;
50        Ok(i64::from_le_bytes(buf))
51    }
52
53    fn read_f32_le(&mut self) -> Result<f32> {
54        let mut buf = [0u8; 4];
55        self.read_exact(&mut buf)?;
56        Ok(f32::from_le_bytes(buf))
57    }
58
59    fn read_f64_le(&mut self) -> Result<f64> {
60        let mut buf = [0u8; 8];
61        self.read_exact(&mut buf)?;
62        Ok(f64::from_le_bytes(buf))
63    }
64}
65
66/// Extension trait for writing little-endian values to a writer
67pub trait WriteExt: Write {
68    fn write_u8(&mut self, n: u8) -> Result<()> {
69        self.write_all(&[n])
70    }
71
72    fn write_u16_le(&mut self, n: u16) -> Result<()> {
73        self.write_all(&n.to_le_bytes())
74    }
75
76    fn write_u32_le(&mut self, n: u32) -> Result<()> {
77        self.write_all(&n.to_le_bytes())
78    }
79
80    fn write_u64_le(&mut self, n: u64) -> Result<()> {
81        self.write_all(&n.to_le_bytes())
82    }
83
84    fn write_i8(&mut self, n: i8) -> Result<()> {
85        self.write_all(&n.to_le_bytes())
86    }
87
88    fn write_i16_le(&mut self, n: i16) -> Result<()> {
89        self.write_all(&n.to_le_bytes())
90    }
91
92    fn write_i32_le(&mut self, n: i32) -> Result<()> {
93        self.write_all(&n.to_le_bytes())
94    }
95
96    fn write_i64_le(&mut self, n: i64) -> Result<()> {
97        self.write_all(&n.to_le_bytes())
98    }
99
100    fn write_f32_le(&mut self, n: f32) -> Result<()> {
101        self.write_all(&n.to_le_bytes())
102    }
103
104    fn write_f64_le(&mut self, n: f64) -> Result<()> {
105        self.write_all(&n.to_le_bytes())
106    }
107}
108
109// Implement the traits for all types that implement Read/Write
110impl<R: Read + ?Sized> ReadExt for R {}
111impl<W: Write + ?Sized> WriteExt for W {}