use std::io::{self, Read, Write};
use integer_encoding::VarIntReader;
use integer_encoding::VarIntWriter;
use crate::config::MAX_NUM_LEVELS;
pub(crate) trait WriteHelpers {
fn write_length_prefixed_slice(&mut self, slice: &[u8]) -> io::Result<usize>;
}
impl<W: Write> WriteHelpers for W {
fn write_length_prefixed_slice(&mut self, slice: &[u8]) -> io::Result<usize> {
let mut bytes_written: usize = 0;
bytes_written += self.write_varint(slice.len() as u32)?;
self.write_all(slice)?;
bytes_written += slice.len();
Ok(bytes_written)
}
}
pub(crate) trait ReadHelpers {
fn read_raindb_level(&mut self) -> io::Result<usize>;
fn read_length_prefixed_slice(&mut self) -> io::Result<Vec<u8>>;
}
impl<R: Read> ReadHelpers for R {
fn read_raindb_level(&mut self) -> io::Result<usize> {
let level = self.read_varint::<u32>()? as usize;
if level >= MAX_NUM_LEVELS {
return Err(io::Error::new(
io::ErrorKind::InvalidData,
format!("The level was invalid. Found {level}", level = level),
));
}
Ok(level)
}
fn read_length_prefixed_slice(&mut self) -> io::Result<Vec<u8>> {
let length = self.read_varint::<u32>()? as usize;
let mut buf = vec![0_u8; length];
self.read_exact(&mut buf)?;
Ok(buf)
}
}