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 writer = if let Self::Writer(w) = self { w }
else { panic!("You cannot write on a reader") }; unwrap_result!(writer.write(byte) => |e| Err(LDBError::IOError(e)));
Ok(())
}
pub fn read(&mut self, length: usize) -> Result<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();
unwrap_result!(reader.read(&mut buffer) => |e| Err(LDBError::IOError(e)));
Ok(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) => |e| Err(LDBError::IOError(e)));
Ok(buffer.into_boxed_slice())
}
}