ninep_proto/
deku_bytes.rs1use alloc::vec::Vec;
2use bytes::Bytes;
3use deku::ctx::Order;
4use deku::no_std_io::{Read, Seek, Write};
5use deku::prelude::*;
6use deku::reader::Reader;
7use deku::writer::Writer;
8
9use crate::{ByteStorage, WireBytes};
10
11pub type DekuBytes<B = Bytes> = WireBytes<B>;
13
14impl From<Vec<u8>> for WireBytes<Bytes> {
15 fn from(vec: Vec<u8>) -> Self {
16 Self(Bytes::from(vec))
17 }
18}
19
20impl From<WireBytes<Bytes>> for Bytes {
21 fn from(deku_bytes: WireBytes<Bytes>) -> Self {
22 deku_bytes.0
23 }
24}
25
26const READ_CHUNK_SIZE: usize = 64 * 1024;
27
28impl<'a, B> DekuReader<'a, &u32> for WireBytes<B>
29where
30 B: ByteStorage + From<Vec<u8>>,
31{
32 fn from_reader_with_ctx<R: Read + Seek>(
33 reader: &mut Reader<R>,
34 count: &u32,
35 ) -> Result<Self, DekuError> {
36 let count = *count as usize;
37 let mut buf = Vec::with_capacity(count.min(READ_CHUNK_SIZE));
39 let mut remaining = count;
40 while remaining > 0 {
41 let chunk = remaining.min(READ_CHUNK_SIZE);
42 let start = buf.len();
43 buf.resize(start + chunk, 0);
44 reader.read_bytes(chunk, &mut buf[start..], Order::Lsb0)?;
45 remaining -= chunk;
46 }
47 Ok(Self(B::from(buf)))
48 }
49}
50
51impl<B: ByteStorage> DekuWriter<&u32> for WireBytes<B> {
52 fn to_writer<W: Write + Seek>(
53 &self,
54 writer: &mut Writer<W>,
55 _count: &u32,
56 ) -> Result<(), DekuError> {
57 writer.write_bytes(self.0.as_ref())?;
58 Ok(())
59 }
60}