use crate::core::{Error, Packet, Result};
use crate::wire::{EnvelopeHeader, WireEnvelope};
pub struct EncodeTarget<'a> {
bytes: &'a mut [u8],
written: usize,
}
impl<'a> EncodeTarget<'a> {
#[must_use]
pub const fn new(bytes: &'a mut [u8]) -> Self {
Self { bytes, written: 0 }
}
#[must_use]
pub fn written(&self) -> &[u8] {
&self.bytes[..self.written]
}
#[must_use]
pub const fn written_len(&self) -> usize {
self.written
}
pub fn set_written(&mut self, written: usize) -> Result<()> {
if written > self.bytes.len() {
return Err(Error::buffer_too_small());
}
self.written = written;
Ok(())
}
#[must_use]
pub const fn capacity(&self) -> usize {
self.bytes.len()
}
}
pub trait Encoder {
fn encode_packet(&mut self, packet: Packet<'_>, target: &mut EncodeTarget<'_>) -> Result<()>;
fn encoded_len(&self, packet: Packet<'_>) -> usize {
EnvelopeHeader::new(packet.payload_len() as u8).total_len(crate::integrity::Crc16::TAG_LEN)
}
fn envelope_for<'a>(&self, packet: Packet<'a>) -> WireEnvelope<'a> {
WireEnvelope::new(
EnvelopeHeader::new(packet.payload_len() as u8),
packet.payload_bytes(),
)
}
}