casper_types/
file_utils.rsuse std::{
fs,
io::{self, Write},
os::unix::fs::OpenOptionsExt,
path::{Path, PathBuf},
};
use thiserror::Error;
#[derive(Debug, Error)]
#[error("could not read '{0}': {error}", .path.display())]
pub struct ReadFileError {
path: PathBuf,
#[source]
error: io::Error,
}
#[derive(Debug, Error)]
#[error("could not write to '{0}': {error}", .path.display())]
pub struct WriteFileError {
path: PathBuf,
#[source]
error: io::Error,
}
pub fn read_file<P: AsRef<Path>>(filename: P) -> Result<Vec<u8>, ReadFileError> {
let path = filename.as_ref();
fs::read(path).map_err(|error| ReadFileError {
path: path.to_owned(),
error,
})
}
pub(crate) fn write_file<P: AsRef<Path>, B: AsRef<[u8]>>(
filename: P,
data: B,
) -> Result<(), WriteFileError> {
let path = filename.as_ref();
fs::write(path, data.as_ref()).map_err(|error| WriteFileError {
path: path.to_owned(),
error,
})
}
pub(crate) fn write_private_file<P: AsRef<Path>, B: AsRef<[u8]>>(
filename: P,
data: B,
) -> Result<(), WriteFileError> {
let path = filename.as_ref();
fs::OpenOptions::new()
.write(true)
.create(true)
.truncate(true)
.mode(0o600)
.open(path)
.and_then(|mut file| file.write_all(data.as_ref()))
.map_err(|error| WriteFileError {
path: path.to_owned(),
error,
})
}