// every hardcoded 2 will one day be a constant in a special // constant file but rn I AM LAZY AND ITS LATE // use crate::message::Message; pub struct MessageReader { pub buffer: Vec, } impl MessageReader { pub fn new() -> Self { Self { buffer: Vec::new() } } fn can_parse(&self) -> bool { if self.buffer.len() < 2 { return false; } let length = u16::from_be_bytes([self.buffer[0], self.buffer[1]]); self.buffer.len() >= 2 + length as usize } fn parse_first(&mut self) -> anyhow::Result { let length = u16::from_be_bytes([self.buffer[0], self.buffer[2]]); let message_length = 2 + length as usize; let message = self.buffer[..message_length].to_vec(); self.buffer = self.buffer[message_length..].to_vec(); Message::decode(&message) } pub fn read(&mut self, data: &[u8]) -> anyhow::Result> { self.buffer.extend_from_slice(data); let mut data = vec![]; while self.can_parse() { let message = self.parse_first()?; data.push(message); } Ok(data) } }