mc_network_io/
primitives.rs

1use std::io::{Read, Result, Write};
2
3pub trait BoolRead {
4    fn read_bool(&mut self) -> Result<bool>;
5}
6
7pub trait WriteBool {
8    fn write_bool(&mut self, value: bool) -> Result<()>;
9}
10
11impl<R: Read> BoolRead for R {
12    fn read_bool(&mut self) -> Result<bool> {
13        let buf = &mut [0];
14        self.read_exact(buf)?;
15        Ok(unsafe { std::mem::transmute(buf[0]) })
16    }
17}
18
19impl<W: Write> WriteBool for W {
20    fn write_bool(&mut self, value: bool) -> Result<()> {
21        self.write_all(&[value as u8])?;
22        Ok(())
23    }
24}
25
26pub trait U8Read {
27    fn read_u8(&mut self) -> Result<u8>;
28}
29
30pub trait U8Write {
31    fn write_u8(&mut self, value: u8) -> Result<()>;
32}
33
34impl<R: Read> U8Read for R {
35    fn read_u8(&mut self) -> Result<u8> {
36        let mut buf = [0u8];
37        self.read_exact(&mut buf)?;
38        Ok(buf[0])
39    }
40}
41
42pub trait I8Read {
43    fn read_i8(&mut self) -> Result<i8>;
44}
45
46impl<R: Read> I8Read for R {
47    fn read_i8(&mut self) -> Result<i8> {
48        let mut buf = [0];
49        self.read_exact(&mut buf)?;
50        Ok(buf[0] as i8)
51    }
52}
53
54pub trait I8Write {
55    fn write_i8(&mut self, value: i8) -> Result<()>;
56}
57
58impl<W: Write> I8Write for W {
59    fn write_i8(&mut self, value: i8) -> Result<()> {
60        self.write_all(&[value as u8])?;
61        Ok(())
62    }
63}
64
65impl<W: Write> U8Write for W {
66    fn write_u8(&mut self, value: u8) -> Result<()> {
67        self.write_all(&[value])?;
68        Ok(())
69    }
70}
71
72pub trait U16Read {
73    fn read_u16(&mut self) -> Result<u16>;
74}
75
76impl<R: Read> U16Read for R {
77    fn read_u16(&mut self) -> Result<u16> {
78        let mut buf = [0; 2];
79        self.read_exact(&mut buf)?;
80        Ok(u16::from_be_bytes(buf))
81    }
82}
83
84pub trait U16Write {
85    fn write_u16(&mut self, value: u16) -> Result<()>;
86}
87
88impl<W: Write> U16Write for W {
89    fn write_u16(&mut self, value: u16) -> Result<()> {
90        self.write_all(&value.to_be_bytes())?;
91        Ok(())
92    }
93}
94
95pub trait I64Read {
96    fn read_i64(&mut self) -> Result<i64>;
97}
98
99pub trait I64Write {
100    fn write_i64(&mut self, value: i64) -> Result<()>;
101}
102
103impl<R: Read> I64Read for R {
104    fn read_i64(&mut self) -> Result<i64> {
105        let mut buf = [0; 8];
106        self.read_exact(&mut buf)?;
107        Ok(i64::from_be_bytes(buf))
108    }
109}
110
111impl<W: Write> I64Write for W {
112    fn write_i64(&mut self, value: i64) -> Result<()> {
113        self.write_all(&value.to_be_bytes())?;
114        Ok(())
115    }
116}
117
118pub trait U128Read {
119    fn read_u128(&mut self) -> Result<u128>;
120}
121
122pub trait U128Write {
123    fn write_u128(&mut self, value: u128) -> Result<()>;
124}
125
126impl<R: Read> U128Read for R {
127    fn read_u128(&mut self) -> Result<u128> {
128        let mut buf = [0; 16];
129        self.read_exact(&mut buf)?;
130        Ok(u128::from_be_bytes(buf))
131    }
132}
133
134impl<W: Write> U128Write for W {
135    fn write_u128(&mut self, value: u128) -> Result<()> {
136        self.write_all(&value.to_be_bytes())?;
137        Ok(())
138    }
139}