use super::*;
use std::io::{Read, Write, BufReader, BufWriter, Error};
use std::fs::File;
pub enum FileWrapper {
Reader(BufReader<File>),
Writer(BufWriter<File>),
}
impl FileWrapper {
pub fn new_reader(file: File) -> Self {
Self::Reader(
BufReader::new(file),
)
}
pub fn new_writer(file: File) -> Self {
Self::Writer(
BufWriter::new(file),
)
}
pub fn write(&mut self, byte: &[u8]) -> Result<(), LDBError> {
let mut writer = if let Self::Writer(w) = self { w }
else { panic!("You cannot write on a reader") }; unwrap_result!((Write::write_all(&mut writer, byte)) err => LDBError::IOError(err));
Ok(())
}
pub fn read(&mut self, length: usize) -> Result<Box<[u8]>, LDBError> {
let mut reader = if let Self::Reader(r) = self { r }
else { panic!("You cannot read on a writer") }; let mut buffer = vec![0u8; length].into_boxed_slice();
unwrap_result!((Read::read_exact(&mut reader, &mut buffer)) err => LDBError::IOError(err));
Ok(buffer)
}
pub fn read_opt(&mut self, length: usize) -> Result<Option<Box<[u8]>>, LDBError> {
let reader = if let Self::Reader(r) = self { r }
else { panic!("You cannot read on a writer") }; let mut buffer = vec![0u8; length].into_boxed_slice();
let read = unwrap_result!((reader.read(&mut buffer)) err => LDBError::IOError(err));
if read < length { Ok(None) }
else { Ok(Some(buffer)) }
}
pub fn finish(self) -> Result<(), Error> {
match self {
Self::Reader(_) => (),
Self::Writer(mut w) => w.flush()?,
};
Ok(())
}
pub fn read_to_end(self) -> Result<Box<[u8]>, LDBError> {
let mut reader = if let Self::Reader(r) = self { r }
else { panic!("You cannot read on a writer") }; let mut buffer = Vec::new();
unwrap_result!((reader.read_to_end(&mut buffer)) err => LDBError::IOError(err));
Ok(buffer.into_boxed_slice())
}
}