Skip to main content

bincode_purplecoin/features/
impl_std.rs

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/// Decode type `D` from the given reader with the given `Config`. The reader can be any type that implements `std::io::Read`, e.g. `std::fs::File`.
20///
21/// See the [config] module for more information about config options.
22///
23/// [config]: config/index.html
24#[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/// Encode the given value into any type that implements `std::io::Write`, e.g. `std::fs::File`, with the given `Config`.
80/// See the [config] module for more information.
81///
82/// [config]: config/index.html
83#[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            // See the documentation on `unclaim_bytes_read` as to why we're doing this here
387            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            // See the documentation on `unclaim_bytes_read` as to why we're doing this here
408            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}