extern crate alloc;
use alloc::collections::VecDeque;
use alloc::vec::Vec;
use irox_bits::{Bits, Error, ErrorKind, MutBits};
pub type PacketData = Vec<u8>;
pub trait Packet {
type PacketType;
fn get_bytes(&self) -> Result<Vec<u8>, Error>;
fn write_to<T: MutBits>(&self, out: &mut T) -> Result<(), Error> {
out.write_all_bytes(self.get_bytes()?.as_slice())
}
fn get_type(&self) -> Self::PacketType;
}
pub trait PacketBuilder<P> {
type Error;
fn build_from<T: Bits>(&self, input: &mut T) -> Result<P, Self::Error>;
}
pub trait Packetization<T: Bits> {
fn read_next_packet(&mut self, source: &mut T) -> Result<PacketData, Error>;
}
pub trait PacketTransport {
type Error;
fn poll_next_packet(&mut self) -> Result<PacketData, Self::Error>;
fn start(&mut self) -> Result<(), Self::Error>;
fn stop(&mut self) -> Result<(), Self::Error>;
}
pub struct Packetizer<'a, R: Bits, P: Packetization<R>> {
reader: &'a mut R,
chunker: &'a mut P,
}
impl<R, P> PacketTransport for Packetizer<'_, R, P>
where
R: Bits,
P: Packetization<R>,
{
type Error = irox_bits::Error;
fn poll_next_packet(&mut self) -> Result<PacketData, Self::Error> {
self.chunker.read_next_packet(self.reader)
}
fn start(&mut self) -> Result<(), Self::Error> {
Ok(())
}
fn stop(&mut self) -> Result<(), Self::Error> {
Ok(())
}
}
#[derive(Default)]
pub struct DelimitedPacketizer {
pub delimiter: Vec<u8>,
pub include_delimiter: bool,
pub max_buffer_size: usize,
buffer: Vec<u8>,
}
impl<T: Bits> Packetization<T> for DelimitedPacketizer {
fn read_next_packet(&mut self, source: &mut T) -> Result<PacketData, Error> {
if self.delimiter.is_empty() {
return Err(Error::new(ErrorKind::InvalidData, "Delimiter is empty"));
}
self.buffer.clear();
let del_len = self.delimiter.len();
let mut ringbuf: VecDeque<u8> = VecDeque::with_capacity(del_len);
source.read_exact_into(del_len, &mut ringbuf.as_mut_slices().0)?;
loop {
if ringbuf.eq(&self.delimiter) {
let mut outbuf = self.buffer.clone();
if self.include_delimiter {
outbuf.extend(&self.delimiter);
}
return Ok(outbuf);
}
if self.buffer.len() == self.max_buffer_size {
return Err(Error::new(
ErrorKind::OutOfMemory,
"Packet exceeded max buffer size",
));
}
let Some(val) = source.next_u8()? else {
return Ok(self.buffer.clone());
};
ringbuf.pop_front();
ringbuf.push_back(val);
}
}
}