blob: 780b0ba9837268bb2bd901786c81f61d0df37498 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
use super::{field::Field, varint};
pub trait Transport: embedded_io_async::Read + embedded_io_async::Write {}
impl<T> Transport for T where T: embedded_io_async::Read + embedded_io_async::Write {}
pub(crate) trait TransportExt: Transport {
async fn write_fields(&mut self, fields: &[Field]) -> Result<(), Self::Error>;
}
impl<T> TransportExt for T
where
T: Transport,
{
async fn write_fields(&mut self, fields: &[Field<'_>]) -> Result<(), Self::Error> {
for field in fields {
match field {
Field::U8(v) => self.write_all(&[*v]).await?,
Field::U16(v) => self.write_all(&u16::to_be_bytes(*v)).await?,
Field::VarInt(v) => {
let (v_buf, v_len) = varint::encode(*v);
self.write_all(&v_buf[..v_len]).await?;
}
Field::Buffer(v) => self.write_all(v).await?,
Field::LenPrefixedBuffer(v) => {
self.write_all(&u16::to_be_bytes(u16::try_from(v.len()).unwrap()))
.await?;
self.write_all(v).await?;
}
Field::LenPrefixedString(v) => {
self.write_all(&u16::to_be_bytes(u16::try_from(v.len()).unwrap()))
.await?;
self.write_all(v.as_bytes()).await?;
}
}
}
Ok(())
}
}
|