1use std::io::{self, Read, Result, Seek, SeekFrom, Write};
6
7pub mod in_borrowed;
8pub mod in_stream;
9pub mod out_borrowed;
10pub mod out_stream;
11pub mod prelude;
12
13pub trait WriteOctetStream {
14 fn write(&mut self, v: &[u8]) -> Result<()>;
15 fn write_u64(&mut self, v: u64) -> Result<()>;
16 fn write_i64(&mut self, v: i64) -> Result<()>;
17 fn write_u32(&mut self, v: u32) -> Result<()>;
18 fn write_i32(&mut self, v: i32) -> Result<()>;
19 fn write_u16(&mut self, v: u16) -> Result<()>;
20 fn write_i16(&mut self, v: i16) -> Result<()>;
21 fn write_u8(&mut self, v: u8) -> Result<()>;
22 fn write_i8(&mut self, v: i8) -> Result<()>;
23}
24
25impl<W: Write> WriteOctetStream for W {
26 fn write(&mut self, v: &[u8]) -> io::Result<()> {
28 self.write_all(v)
29 }
30
31 fn write_u64(&mut self, v: u64) -> io::Result<()> {
33 self.write_all(&v.to_be_bytes())
34 }
35
36 fn write_i64(&mut self, v: i64) -> io::Result<()> {
38 self.write_all(&v.to_be_bytes())
39 }
40
41 fn write_u32(&mut self, v: u32) -> io::Result<()> {
43 self.write_all(&v.to_be_bytes())
44 }
45
46 fn write_i32(&mut self, v: i32) -> io::Result<()> {
48 self.write_all(&v.to_be_bytes())
49 }
50
51 fn write_u16(&mut self, v: u16) -> io::Result<()> {
53 self.write_all(&v.to_be_bytes())
54 }
55
56 fn write_i16(&mut self, v: i16) -> io::Result<()> {
58 self.write_all(&v.to_be_bytes())
59 }
60
61 fn write_u8(&mut self, v: u8) -> io::Result<()> {
63 self.write_all(&[v])
64 }
65
66 fn write_i8(&mut self, v: i8) -> io::Result<()> {
68 self.write_all(&[v as u8])
69 }
70}
71
72pub trait ReadOctetStream {
73 fn read(&mut self, v: &mut [u8]) -> Result<()>;
74 fn read_u64(&mut self) -> Result<u64>;
75 fn read_i64(&mut self) -> Result<i64>;
76 fn read_u32(&mut self) -> Result<u32>;
77 fn read_i32(&mut self) -> Result<i32>;
78 fn read_u16(&mut self) -> Result<u16>;
79 fn read_i16(&mut self) -> Result<i16>;
80 fn read_u8(&mut self) -> Result<u8>;
81 fn read_i8(&mut self) -> Result<i8>;
82 #[must_use]
83 fn has_reached_end(&mut self) -> bool;
84}
85
86impl<R: Read + Seek> ReadOctetStream for R {
88 fn read(&mut self, v: &mut [u8]) -> io::Result<()> {
90 self.read_exact(v)
91 }
92
93 fn read_u64(&mut self) -> io::Result<u64> {
95 let mut buf = [0u8; 8];
96 self.read_exact(&mut buf)?;
97 Ok(u64::from_be_bytes(buf))
98 }
99
100 fn read_i64(&mut self) -> io::Result<i64> {
102 let mut buf = [0u8; 8];
103 self.read_exact(&mut buf)?;
104 Ok(i64::from_be_bytes(buf))
105 }
106
107 fn read_u32(&mut self) -> io::Result<u32> {
109 let mut buf = [0u8; 4];
110 self.read_exact(&mut buf)?;
111 Ok(u32::from_be_bytes(buf))
112 }
113
114 fn read_i32(&mut self) -> io::Result<i32> {
116 let mut buf = [0u8; 4];
117 self.read_exact(&mut buf)?;
118 Ok(i32::from_be_bytes(buf))
119 }
120
121 fn read_u16(&mut self) -> io::Result<u16> {
123 let mut buf = [0u8; 2];
124 self.read_exact(&mut buf)?;
125 Ok(u16::from_be_bytes(buf))
126 }
127
128 fn read_i16(&mut self) -> io::Result<i16> {
130 let mut buf = [0u8; 2];
131 self.read_exact(&mut buf)?;
132 Ok(i16::from_be_bytes(buf))
133 }
134
135 fn read_u8(&mut self) -> io::Result<u8> {
137 let mut buf = [0u8; 1];
138 self.read_exact(&mut buf)?;
139 Ok(buf[0])
140 }
141
142 fn read_i8(&mut self) -> io::Result<i8> {
144 let octet = self.read_u8()?;
145 Ok(octet as i8)
146 }
147
148 fn has_reached_end(&mut self) -> bool {
154 let current_pos = match self.stream_position() {
155 Ok(pos) => pos,
156 Err(_) => return false, };
158
159 let mut buffer = [0u8; 1];
160 let result = self.read_exact(&mut buffer);
161
162 match result {
163 Ok(_) => {
164 let _ = self.seek(SeekFrom::Start(current_pos));
165 false
166 }
167 Err(ref e) if e.kind() == io::ErrorKind::UnexpectedEof => true,
168 Err(_) => false,
169 }
170 }
171}
172
173pub trait SeekOctetStream {
175 fn seek(&mut self, pos: u64) -> io::Result<()>;
186
187 fn stream_position(&mut self) -> io::Result<u64>;
194}
195
196impl<S: Seek> SeekOctetStream for S {
198 fn seek(&mut self, pos: u64) -> io::Result<()> {
200 self.seek(SeekFrom::Start(pos)).map(|_| ())
201 }
202
203 fn stream_position(&mut self) -> io::Result<u64> {
205 self.stream_position()
206 }
207}
208
209pub trait Deserialize: Sized {
210 fn deserialize(stream: &mut impl ReadOctetStream) -> Result<Self>;
211}
212
213pub trait Serialize: Sized {
214 fn serialize(&self, stream: &mut impl WriteOctetStream) -> Result<()>;
215}
216
217pub trait BufferDeserializer: Sized {
219 fn deserialize(buf: &[u8]) -> Result<(Self, usize)>;
231}
232
233pub trait BufferSerializer: Sized {
235 fn serialize(&self, buf: &mut &[u8]) -> Result<usize>;
247}