durak/src/message_read.rs

45 lines
1.1 KiB
Rust
Raw Normal View History

2025-01-26 02:15:37 +01:00
// 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<u8>,
}
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<Message> {
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<Vec<Message>> {
self.buffer.extend_from_slice(data);
let mut data = vec![];
while self.can_parse() {
let message = self.parse_first()?;
data.push(message);
}
Ok(data)
}
}