45 lines
1.1 KiB
Rust
45 lines
1.1 KiB
Rust
|
// 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)
|
||
|
}
|
||
|
}
|