lazy_db/lazy_data/
file_wrapper.rs

1use super::*;
2use std::io::{Read, Write, BufReader, BufWriter, Error};
3use std::fs::File;
4
5pub enum FileWrapper {
6    Reader(BufReader<File>),
7    Writer(BufWriter<File>),
8}
9
10impl FileWrapper {
11    /// Constructs a new `FileWrapper::Reader` varient
12    pub fn new_reader(file: File) -> Self {
13        Self::Reader(
14            BufReader::new(file),
15        )
16    }
17
18    /// Constructs a new `FileWrapper::Writer` varient
19    pub fn new_writer(file: File) -> Self {
20        Self::Writer(
21            BufWriter::new(file),
22        )
23    }
24
25    /// Writes a byte slice into the file
26    pub fn write(&mut self, byte: &[u8]) -> Result<(), LDBError> {
27        let mut writer = if let Self::Writer(w) = self { w }
28            else { panic!("You cannot write on a reader") }; // Change later to use better error handling
29        unwrap_result!((Write::write_all(&mut writer, byte)) err => LDBError::IOError(err));
30        Ok(())
31    }
32
33    /// Reads a set amount of bytes from a file by padding out undefined portions with 0u8
34    pub fn read(&mut self, length: usize) -> Result<Box<[u8]>, LDBError> {
35        let mut reader = if let Self::Reader(r) = self { r }
36            else { panic!("You cannot read on a writer") }; // Change later to use better error handling
37        let mut buffer = vec![0u8; length].into_boxed_slice();
38        unwrap_result!((Read::read_exact(&mut reader, &mut buffer)) err => LDBError::IOError(err));
39        Ok(buffer)
40    }
41
42    pub fn read_opt(&mut self, length: usize) -> Result<Option<Box<[u8]>>, LDBError> {
43        let reader = if let Self::Reader(r) = self { r }
44            else { panic!("You cannot read on a writer") }; // Change later to use better error handling
45        let mut buffer = vec![0u8; length].into_boxed_slice();
46        let read = unwrap_result!((reader.read(&mut buffer)) err => LDBError::IOError(err));
47        if read < length { Ok(None) }
48        else { Ok(Some(buffer)) }
49    }
50
51    /// Deconstruct the wrapper properly with all of the buffers and such
52    pub fn finish(self) -> Result<(), Error> {
53        match self {
54            Self::Reader(_) => (),
55            Self::Writer(mut w) => w.flush()?,
56        };
57        Ok(())
58    }
59
60    /// Reads to the end of the file (consumes wrapper)
61    pub fn read_to_end(self) -> Result<Box<[u8]>, LDBError> {
62        let mut reader = if let Self::Reader(r) = self { r }
63            else { panic!("You cannot read on a writer") }; // Change later to use better error handling
64        let mut buffer = Vec::new();
65        unwrap_result!((reader.read_to_end(&mut buffer)) err => LDBError::IOError(err));
66        Ok(buffer.into_boxed_slice())
67    }
68}