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#[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#[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}