mc_network_io/
primitives.rs1use 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}