1use crate::{Error, Meta};
4use std::{
5 fs,
6 fs::File,
7 io::{BufWriter, Read as StdRead, Write as StdWrite},
8};
9
10pub trait Read: Meta {
12 fn read(&self) -> Result<Vec<u8>, Error> {
14 let mut f = File::open(self.real_path()?)?;
15 let mut buffer = Vec::new();
16
17 f.read_to_end(&mut buffer)?;
19 Ok(buffer)
20 }
21}
22
23pub trait Write: Meta {
25 fn write<B>(&self, stream: B) -> Result<(), Error>
27 where
28 B: AsRef<[u8]>,
29 {
30 let src = self.real_path()?;
31 if let Some(parent) = src.parent() {
32 if !parent.exists() {
33 fs::create_dir_all(parent)?;
34 }
35 } else {
36 return Err(Error::Custom(format!(
37 "Invalid file path: {}",
38 self.real_path()?.to_string_lossy(),
39 )));
40 }
41
42 let f = File::create(src)?;
43 let mut writer = BufWriter::new(f);
44
45 writer.write_all(stream.as_ref())?;
46 writer.flush()?;
47 Ok(())
48 }
49}
50
51impl<T> Read for T where T: Meta {}
52impl<T> Write for T where T: Meta {}