use bytes::BytesMut;
use eds_core::crc::get_crc;
use eds_core::frame::*;
pub struct Writer {
lead_len: u8,
fixed: BytesMut,
}
impl Writer {
pub fn new(lead_len: u8) -> Self {
let mut buf = BytesMut::new();
for _ in 0..lead_len {
buf.extend([CHAR_LEAD]);
}
buf.extend([CHAR_START]);
buf.extend([0, 0]);
Self {
lead_len,
fixed: buf,
}
}
pub fn get_load(&mut self) -> Option<BytesMut> {
let fixed_len = self.lead_len as usize + Field::Load as usize;
if self.fixed.capacity() <= fixed_len {
return None;
}
let mut load = self.fixed.split_off(fixed_len);
load.clear();
Some(load)
}
pub fn get_data(&mut self, load: BytesMut) -> &[u8] {
let len = load.len();
let crc = get_crc(&load);
self.fixed[self.lead_len as usize + Field::Length as usize] = (len >> 8) as u8;
self.fixed[self.lead_len as usize + Field::Length as usize + 1] = (len) as u8;
self.fixed.unsplit(load);
self.fixed.extend([(crc >> 8) as u8, crc as u8, CHAR_END]);
&self.fixed
}
}