1extern crate alloc;
9
10use alloc::collections::VecDeque;
11use alloc::vec::Vec;
12use irox_bits::{Bits, Error, ErrorKind, MutBits};
13
14pub type PacketData = Vec<u8>;
16
17pub trait Packet {
18 type PacketType;
19 fn get_bytes(&self) -> Result<Vec<u8>, Error>;
20
21 fn write_to<T: MutBits>(&self, out: &mut T) -> Result<(), Error> {
22 out.write_all_bytes(self.get_bytes()?.as_slice())
23 }
24
25 fn get_type(&self) -> Self::PacketType;
26}
27
28pub trait PacketBuilder<P> {
29 type Error;
30
31 fn build_from<T: Bits>(&self, input: &mut T) -> Result<P, Self::Error>;
32}
33
34pub trait Packetization<T: Bits> {
38 fn read_next_packet(&mut self, source: &mut T) -> Result<PacketData, Error>;
40}
41
42pub trait PacketTransport {
46 type Error;
47
48 fn poll_next_packet(&mut self) -> Result<PacketData, Self::Error>;
50
51 fn start(&mut self) -> Result<(), Self::Error>;
53
54 fn stop(&mut self) -> Result<(), Self::Error>;
56}
57
58pub struct Packetizer<'a, R: Bits, P: Packetization<R>> {
61 reader: &'a mut R,
62 chunker: &'a mut P,
63}
64
65impl<R, P> PacketTransport for Packetizer<'_, R, P>
66where
67 R: Bits,
68 P: Packetization<R>,
69{
70 type Error = irox_bits::Error;
71
72 fn poll_next_packet(&mut self) -> Result<PacketData, Self::Error> {
74 self.chunker.read_next_packet(self.reader)
75 }
76
77 fn start(&mut self) -> Result<(), Self::Error> {
79 Ok(())
81 }
82
83 fn stop(&mut self) -> Result<(), Self::Error> {
85 Ok(())
87 }
88}
89
90#[derive(Default)]
93pub struct DelimitedPacketizer {
94 pub delimiter: Vec<u8>,
96
97 pub include_delimiter: bool,
99
100 pub max_buffer_size: usize,
102
103 buffer: Vec<u8>,
105}
106
107impl<T: Bits> Packetization<T> for DelimitedPacketizer {
108 fn read_next_packet(&mut self, source: &mut T) -> Result<PacketData, Error> {
109 if self.delimiter.is_empty() {
110 return Err(Error::new(ErrorKind::InvalidData, "Delimiter is empty"));
111 }
112
113 self.buffer.clear();
114 let del_len = self.delimiter.len();
115
116 let mut ringbuf: VecDeque<u8> = VecDeque::with_capacity(del_len);
117 source.read_exact_into(del_len, &mut ringbuf.as_mut_slices().0)?;
118
119 loop {
120 if ringbuf.eq(&self.delimiter) {
121 let mut outbuf = self.buffer.clone();
122 if self.include_delimiter {
123 outbuf.extend(&self.delimiter);
124 }
125 return Ok(outbuf);
126 }
127
128 if self.buffer.len() == self.max_buffer_size {
129 return Err(Error::new(
130 ErrorKind::OutOfMemory,
131 "Packet exceeded max buffer size",
132 ));
133 }
134 let Some(val) = source.next_u8()? else {
135 return Ok(self.buffer.clone());
136 };
137
138 ringbuf.pop_front();
139 ringbuf.push_back(val);
140 }
141 }
142}