etc/
io.rs

1//! read and write
2
3use crate::{Error, Meta};
4use std::{
5    fs,
6    fs::File,
7    io::{BufWriter, Read as StdRead, Write as StdWrite},
8};
9
10/// io read
11pub trait Read: Meta {
12    /// read stream from file
13    fn read(&self) -> Result<Vec<u8>, Error> {
14        let mut f = File::open(self.real_path()?)?;
15        let mut buffer = Vec::new();
16
17        // read the whole file
18        f.read_to_end(&mut buffer)?;
19        Ok(buffer)
20    }
21}
22
23/// io write
24pub trait Write: Meta {
25    /// write stream into file
26    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 {}