1use crate::{
2 config::Config,
3 de::{read::Reader, BorrowDecode, BorrowDecoder, Decode, Decoder, DecoderImpl},
4 enc::{write::Writer, Encode, Encoder, EncoderImpl},
5 error::{DecodeError, EncodeError},
6};
7use core::time::Duration;
8use std::{
9 collections::{HashMap, HashSet},
10 ffi::{CStr, CString},
11 hash::Hash,
12 io::Read,
13 net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6},
14 path::{Path, PathBuf},
15 sync::{Mutex, RwLock},
16 time::SystemTime,
17};
18
19#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
25pub fn decode_from_std_read<D: Decode, C: Config, R: std::io::Read>(
26 src: &mut R,
27 config: C,
28) -> Result<D, DecodeError> {
29 let reader = IoReader::new(src);
30 let mut decoder = DecoderImpl::<_, C>::new(reader, config);
31 D::decode(&mut decoder)
32}
33
34pub(crate) struct IoReader<R> {
35 reader: R,
36}
37
38impl<R> IoReader<R> {
39 pub fn new(reader: R) -> Self {
40 Self { reader }
41 }
42}
43
44impl<R> Reader for IoReader<R>
45where
46 R: std::io::Read,
47{
48 #[inline(always)]
49 fn read(&mut self, bytes: &mut [u8]) -> Result<(), DecodeError> {
50 match self.reader.read_exact(bytes) {
51 Ok(_) => Ok(()),
52 Err(_) => Err(DecodeError::UnexpectedEnd),
53 }
54 }
55}
56
57impl<R> Reader for std::io::BufReader<R>
58where
59 R: std::io::Read,
60{
61 fn read(&mut self, bytes: &mut [u8]) -> Result<(), DecodeError> {
62 match self.read_exact(bytes) {
63 Ok(_) => Ok(()),
64 Err(_) => Err(DecodeError::UnexpectedEnd),
65 }
66 }
67
68 #[inline]
69 fn peek_read(&self, n: usize) -> Option<&[u8]> {
70 self.buffer().get(..n)
71 }
72
73 #[inline]
74 fn consume(&mut self, n: usize) {
75 <Self as std::io::BufRead>::consume(self, n);
76 }
77}
78
79#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
84pub fn encode_into_std_write<E: Encode, C: Config, W: std::io::Write>(
85 val: E,
86 dst: &mut W,
87 config: C,
88) -> Result<usize, EncodeError> {
89 let writer = IoWriter::new(dst);
90 let mut encoder = EncoderImpl::<_, C>::new(writer, config);
91 val.encode(&mut encoder)?;
92 Ok(encoder.into_writer().bytes_written())
93}
94
95pub(crate) struct IoWriter<'a, W: std::io::Write> {
96 writer: &'a mut W,
97 bytes_written: usize,
98}
99
100impl<'a, W: std::io::Write> IoWriter<'a, W> {
101 pub fn new(writer: &'a mut W) -> Self {
102 Self {
103 writer,
104 bytes_written: 0,
105 }
106 }
107
108 pub fn bytes_written(&self) -> usize {
109 self.bytes_written
110 }
111}
112
113impl<'storage, W: std::io::Write> Writer for IoWriter<'storage, W> {
114 #[inline(always)]
115 fn write(&mut self, bytes: &[u8]) -> Result<(), EncodeError> {
116 self.writer
117 .write_all(bytes)
118 .map_err(|error| EncodeError::Io {
119 error,
120 index: self.bytes_written,
121 })?;
122 self.bytes_written += bytes.len();
123 Ok(())
124 }
125}
126
127impl<'a> Encode for &'a CStr {
128 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
129 self.to_bytes().encode(encoder)
130 }
131}
132
133impl Encode for CString {
134 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
135 self.as_bytes().encode(encoder)
136 }
137}
138
139impl Decode for CString {
140 fn decode<D: Decoder>(decoder: &mut D) -> Result<Self, DecodeError> {
141 let vec = std::vec::Vec::decode(decoder)?;
142 CString::new(vec).map_err(|inner| DecodeError::CStringNulError { inner })
143 }
144}
145
146impl<T> Encode for Mutex<T>
147where
148 T: Encode,
149{
150 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
151 let t = self.lock().map_err(|_| EncodeError::LockFailed {
152 type_name: core::any::type_name::<Mutex<T>>(),
153 })?;
154 t.encode(encoder)
155 }
156}
157
158impl<T> Decode for Mutex<T>
159where
160 T: Decode,
161{
162 fn decode<D: Decoder>(decoder: &mut D) -> Result<Self, DecodeError> {
163 let t = T::decode(decoder)?;
164 Ok(Mutex::new(t))
165 }
166}
167
168impl<T> Encode for RwLock<T>
169where
170 T: Encode,
171{
172 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
173 let t = self.read().map_err(|_| EncodeError::LockFailed {
174 type_name: core::any::type_name::<RwLock<T>>(),
175 })?;
176 t.encode(encoder)
177 }
178}
179
180impl<T> Decode for RwLock<T>
181where
182 T: Decode,
183{
184 fn decode<D: Decoder>(decoder: &mut D) -> Result<Self, DecodeError> {
185 let t = T::decode(decoder)?;
186 Ok(RwLock::new(t))
187 }
188}
189
190impl Encode for SystemTime {
191 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
192 let duration = self.duration_since(SystemTime::UNIX_EPOCH).map_err(|e| {
193 EncodeError::InvalidSystemTime {
194 inner: e,
195 time: *self,
196 }
197 })?;
198 duration.encode(encoder)
199 }
200}
201
202impl Decode for SystemTime {
203 fn decode<D: Decoder>(decoder: &mut D) -> Result<Self, DecodeError> {
204 let duration = Duration::decode(decoder)?;
205 match SystemTime::UNIX_EPOCH.checked_add(duration) {
206 Some(t) => Ok(t),
207 None => Err(DecodeError::InvalidSystemTime { duration }),
208 }
209 }
210}
211
212impl Encode for &'_ Path {
213 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
214 match self.to_str() {
215 Some(str) => str.encode(encoder),
216 None => Err(EncodeError::InvalidPathCharacters),
217 }
218 }
219}
220
221impl<'de> BorrowDecode<'de> for &'de Path {
222 fn borrow_decode<D: BorrowDecoder<'de>>(decoder: &mut D) -> Result<Self, DecodeError> {
223 let str = <&'de str>::borrow_decode(decoder)?;
224 Ok(Path::new(str))
225 }
226}
227
228impl Encode for PathBuf {
229 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
230 self.as_path().encode(encoder)
231 }
232}
233
234impl Decode for PathBuf {
235 fn decode<D: Decoder>(decoder: &mut D) -> Result<Self, DecodeError> {
236 let string = std::string::String::decode(decoder)?;
237 Ok(string.into())
238 }
239}
240
241impl Encode for IpAddr {
242 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
243 match self {
244 IpAddr::V4(v4) => {
245 0u32.encode(encoder)?;
246 v4.encode(encoder)
247 }
248 IpAddr::V6(v6) => {
249 1u32.encode(encoder)?;
250 v6.encode(encoder)
251 }
252 }
253 }
254}
255
256impl Decode for IpAddr {
257 fn decode<D: Decoder>(decoder: &mut D) -> Result<Self, DecodeError> {
258 match u8::decode(decoder)? {
259 0 => Ok(IpAddr::V4(Ipv4Addr::decode(decoder)?)),
260 1 => Ok(IpAddr::V6(Ipv6Addr::decode(decoder)?)),
261 found => Err(DecodeError::UnexpectedVariant {
262 allowed: crate::error::AllowedEnumVariants::Range { min: 0, max: 1 },
263 found,
264 type_name: core::any::type_name::<IpAddr>(),
265 }),
266 }
267 }
268}
269
270impl Encode for Ipv4Addr {
271 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
272 encoder.writer().write(&self.octets())
273 }
274}
275
276impl Decode for Ipv4Addr {
277 fn decode<D: Decoder>(decoder: &mut D) -> Result<Self, DecodeError> {
278 let mut buff = [0u8; 4];
279 decoder.reader().read(&mut buff)?;
280 Ok(Self::from(buff))
281 }
282}
283
284impl Encode for Ipv6Addr {
285 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
286 encoder.writer().write(&self.octets())
287 }
288}
289
290impl Decode for Ipv6Addr {
291 fn decode<D: Decoder>(decoder: &mut D) -> Result<Self, DecodeError> {
292 let mut buff = [0u8; 16];
293 decoder.reader().read(&mut buff)?;
294 Ok(Self::from(buff))
295 }
296}
297
298impl Encode for SocketAddr {
299 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
300 match self {
301 SocketAddr::V4(v4) => {
302 0u32.encode(encoder)?;
303 v4.encode(encoder)
304 }
305 SocketAddr::V6(v6) => {
306 1u32.encode(encoder)?;
307 v6.encode(encoder)
308 }
309 }
310 }
311}
312
313impl Decode for SocketAddr {
314 fn decode<D: Decoder>(decoder: &mut D) -> Result<Self, DecodeError> {
315 match u8::decode(decoder)? {
316 0 => Ok(SocketAddr::V4(SocketAddrV4::decode(decoder)?)),
317 1 => Ok(SocketAddr::V6(SocketAddrV6::decode(decoder)?)),
318 found => Err(DecodeError::UnexpectedVariant {
319 allowed: crate::error::AllowedEnumVariants::Range { min: 0, max: 1 },
320 found,
321 type_name: core::any::type_name::<SocketAddr>(),
322 }),
323 }
324 }
325}
326
327impl Encode for SocketAddrV4 {
328 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
329 self.ip().encode(encoder)?;
330 self.port().encode(encoder)
331 }
332}
333
334impl Decode for SocketAddrV4 {
335 fn decode<D: Decoder>(decoder: &mut D) -> Result<Self, DecodeError> {
336 let ip = Ipv4Addr::decode(decoder)?;
337 let port = u16::decode(decoder)?;
338 Ok(Self::new(ip, port))
339 }
340}
341
342impl Encode for SocketAddrV6 {
343 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
344 self.ip().encode(encoder)?;
345 self.port().encode(encoder)
346 }
347}
348
349impl Decode for SocketAddrV6 {
350 fn decode<D: Decoder>(decoder: &mut D) -> Result<Self, DecodeError> {
351 let ip = Ipv6Addr::decode(decoder)?;
352 let port = u16::decode(decoder)?;
353 Ok(Self::new(ip, port, 0, 0))
354 }
355}
356
357impl std::error::Error for EncodeError {}
358impl std::error::Error for DecodeError {}
359
360impl<K, V> Encode for HashMap<K, V>
361where
362 K: Encode,
363 V: Encode,
364{
365 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
366 crate::enc::encode_slice_len(encoder, self.len())?;
367 for (k, v) in self.iter() {
368 Encode::encode(k, encoder)?;
369 Encode::encode(v, encoder)?;
370 }
371 Ok(())
372 }
373}
374
375impl<K, V> Decode for HashMap<K, V>
376where
377 K: Decode + Eq + std::hash::Hash,
378 V: Decode,
379{
380 fn decode<D: Decoder>(decoder: &mut D) -> Result<Self, DecodeError> {
381 let len = crate::de::decode_slice_len(decoder)?;
382 decoder.claim_container_read::<(K, V)>(len)?;
383
384 let mut map = HashMap::with_capacity(len);
385 for _ in 0..len {
386 decoder.unclaim_bytes_read(core::mem::size_of::<(K, V)>());
388
389 let k = K::decode(decoder)?;
390 let v = V::decode(decoder)?;
391 map.insert(k, v);
392 }
393 Ok(map)
394 }
395}
396
397impl<T> Decode for HashSet<T>
398where
399 T: Decode + Eq + Hash,
400{
401 fn decode<D: Decoder>(decoder: &mut D) -> Result<Self, DecodeError> {
402 let len = crate::de::decode_slice_len(decoder)?;
403 decoder.claim_container_read::<T>(len)?;
404
405 let mut map = HashSet::new();
406 for _ in 0..len {
407 decoder.unclaim_bytes_read(core::mem::size_of::<T>());
409
410 let key = T::decode(decoder)?;
411 map.insert(key);
412 }
413 Ok(map)
414 }
415}
416
417impl<T> Encode for HashSet<T>
418where
419 T: Encode,
420{
421 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
422 crate::enc::encode_slice_len(encoder, self.len())?;
423 for item in self.iter() {
424 item.encode(encoder)?;
425 }
426 Ok(())
427 }
428}