lazy_db/lazy_data/
file_wrapper.rs1use 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 pub fn new_reader(file: File) -> Self {
13 Self::Reader(
14 BufReader::new(file),
15 )
16 }
17
18 pub fn new_writer(file: File) -> Self {
20 Self::Writer(
21 BufWriter::new(file),
22 )
23 }
24
25 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") }; unwrap_result!((Write::write_all(&mut writer, byte)) err => LDBError::IOError(err));
30 Ok(())
31 }
32
33 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") }; 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") }; 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 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 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") }; 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}