use std::io::{self, Read};
use super::framing::{body_len, decode_frame, read_len};
use crate::Schema;
#[derive(Debug, Default)]
pub struct FrameReader {
buf: Vec<u8>,
}
impl FrameReader {
#[must_use]
pub fn new() -> Self {
Self::default()
}
pub fn read_bytes(&mut self, r: &mut impl Read) -> io::Result<Option<&[u8]>> {
let Some(len) = read_len(r)? else {
return Ok(None);
};
let len = body_len(len)?;
self.buf.clear();
r.take(len as u64).read_to_end(&mut self.buf)?;
if self.buf.len() < len {
return Err(io::ErrorKind::UnexpectedEof.into());
}
Ok(Some(&self.buf))
}
pub fn read<T: Schema>(&mut self, r: &mut impl Read) -> io::Result<Option<T>> {
self.read_bytes(r)?.map(decode_frame).transpose()
}
}