async_proto/impls/
bitvec.rs

1use {
2    std::{
3        future::Future,
4        io::prelude::*,
5        pin::Pin,
6    },
7    bitvec::{
8        order::Lsb0,
9        vec::BitVec,
10    },
11    fallible_collections::FallibleVec as _,
12    tokio::io::{
13        AsyncRead,
14        AsyncReadExt as _,
15        AsyncWrite,
16        AsyncWriteExt as _,
17    },
18    crate::{
19        ErrorContext,
20        LengthPrefixed,
21        Protocol,
22        ReadError,
23        ReadErrorKind,
24        WriteError,
25    },
26};
27
28/// A [`BitVec`] is prefixed with the length in bits as a [`u64`].
29#[cfg_attr(docsrs, doc(cfg(feature = "bitvec")))]
30impl Protocol for BitVec<u8, Lsb0> {
31    fn read<'a, R: AsyncRead + Unpin + Send + 'a>(stream: &'a mut R) -> Pin<Box<dyn Future<Output = Result<Self, ReadError>> + Send + 'a>> {
32        Self::read_length_prefixed(stream, u64::MAX)
33    }
34
35    fn write<'a, W: AsyncWrite + Unpin + Send + 'a>(&'a self, sink: &'a mut W) -> Pin<Box<dyn Future<Output = Result<(), WriteError>> + Send + 'a>> {
36        self.write_length_prefixed(sink, u64::MAX)
37    }
38
39    fn read_sync(stream: &mut impl Read) -> Result<Self, ReadError> {
40        Self::read_length_prefixed_sync(stream, u64::MAX)
41    }
42
43    fn write_sync(&self, sink: &mut impl Write) -> Result<(), WriteError> {
44        self.write_length_prefixed_sync(sink, u64::MAX)
45    }
46}
47
48/// A [`BitVec`] is prefixed with the length in bits.
49#[cfg_attr(docsrs, doc(cfg(feature = "bitvec")))]
50impl LengthPrefixed for BitVec<u8, Lsb0> {
51    fn read_length_prefixed<'a, R: AsyncRead + Unpin + Send + 'a>(stream: &'a mut R, max_len: u64) -> Pin<Box<dyn Future<Output = Result<Self, ReadError>> + Send + 'a>> {
52        Box::pin(async move {
53            let bit_len = super::read_len(stream, max_len, || ErrorContext::BuiltIn { for_type: "bitvec::vec::BitVec<u8, Lsb0>" }).await?;
54            let byte_len = bit_len.div_ceil(8);
55            let mut buf = Vec::default();
56            buf.try_resize(byte_len, 0).map_err(|e| ReadError {
57                context: ErrorContext::BuiltIn { for_type: "bitvec::vec::BitVec<u8, Lsb0>" },
58                kind: e.into(),
59            })?;
60            stream.read_exact(&mut buf).await.map_err(|e| ReadError {
61                context: ErrorContext::BuiltIn { for_type: "bitvec::vec::BitVec<u8, Lsb0>" },
62                kind: e.into(),
63            })?;
64            let mut this = Self::try_from_vec(buf).map_err(|_| ReadError {
65                context: ErrorContext::BuiltIn { for_type: "bitvec::vec::BitVec<u8, Lsb0>" },
66                kind: ReadErrorKind::Custom(format!("too long to view as a bit-slice")),
67            })?;
68            this.truncate(bit_len);
69            Ok(this)
70        })
71    }
72
73    fn write_length_prefixed<'a, W: AsyncWrite + Unpin + Send + 'a>(&'a self, sink: &'a mut W, max_len: u64) -> Pin<Box<dyn Future<Output = Result<(), WriteError>> + Send + 'a>> {
74        Box::pin(async move {
75            super::write_len(sink, self.len(), max_len, || ErrorContext::BuiltIn { for_type: "bitvec::vec::BitVec<u8, Lsb0>" }).await?;
76            sink.write_all(self.as_raw_slice()).await.map_err(|e| WriteError {
77                context: ErrorContext::BuiltIn { for_type: "bitvec::vec::BitVec<u8, Lsb0>" },
78                kind: e.into(),
79            })?;
80            Ok(())
81        })
82    }
83
84    fn read_length_prefixed_sync(stream: &mut impl Read, max_len: u64) -> Result<Self, ReadError> {
85        let bit_len = super::read_len_sync(stream, max_len, || ErrorContext::BuiltIn { for_type: "bitvec::vec::BitVec<u8, Lsb0>" })?;
86        let byte_len = bit_len.div_ceil(8);
87        let mut buf = Vec::default();
88        buf.try_resize(byte_len, 0).map_err(|e| ReadError {
89            context: ErrorContext::BuiltIn { for_type: "bitvec::vec::BitVec<u8, Lsb0>" },
90            kind: e.into(),
91        })?;
92        stream.read_exact(&mut buf).map_err(|e| ReadError {
93            context: ErrorContext::BuiltIn { for_type: "bitvec::vec::BitVec<u8, Lsb0>" },
94            kind: e.into(),
95        })?;
96        let mut this = Self::try_from_vec(buf).map_err(|_| ReadError {
97            context: ErrorContext::BuiltIn { for_type: "bitvec::vec::BitVec<u8, Lsb0>" },
98            kind: ReadErrorKind::Custom(format!("too long to view as a bit-slice")),
99        })?;
100        this.truncate(bit_len);
101        Ok(this)
102    }
103
104    fn write_length_prefixed_sync(&self, sink: &mut impl Write, max_len: u64) -> Result<(), WriteError> {
105        super::write_len_sync(sink, self.len(), max_len, || ErrorContext::BuiltIn { for_type: "bitvec::vec::BitVec<u8, Lsb0>" })?;
106        sink.write_all(self.as_raw_slice()).map_err(|e| WriteError {
107            context: ErrorContext::BuiltIn { for_type: "bitvec::vec::BitVec<u8, Lsb0>" },
108            kind: e.into(),
109        })?;
110        Ok(())
111    }
112}