foundry_common/errors/
fs.rsuse std::{
io,
path::{Path, PathBuf},
};
#[allow(unused_imports)]
use std::fs::{self, File};
#[derive(Debug, thiserror::Error)]
#[allow(missing_docs)]
pub enum FsPathError {
#[error("failed to write to {path:?}: {source}")]
Write { source: io::Error, path: PathBuf },
#[error("failed to read from {path:?}: {source}")]
Read { source: io::Error, path: PathBuf },
#[error("failed to copy from {from:?} to {to:?}: {source}")]
Copy { source: io::Error, from: PathBuf, to: PathBuf },
#[error("failed to read from {path:?}: {source}")]
ReadLink { source: io::Error, path: PathBuf },
#[error("failed to create file {path:?}: {source}")]
CreateFile { source: io::Error, path: PathBuf },
#[error("failed to remove file {path:?}: {source}")]
RemoveFile { source: io::Error, path: PathBuf },
#[error("failed to create dir {path:?}: {source}")]
CreateDir { source: io::Error, path: PathBuf },
#[error("failed to remove dir {path:?}: {source}")]
RemoveDir { source: io::Error, path: PathBuf },
#[error("failed to open file {path:?}: {source}")]
Open { source: io::Error, path: PathBuf },
#[error("failed to parse json file: {path:?}: {source}")]
ReadJson { source: serde_json::Error, path: PathBuf },
#[error("failed to write to json file: {path:?}: {source}")]
WriteJson { source: serde_json::Error, path: PathBuf },
}
impl FsPathError {
pub fn write(source: io::Error, path: impl Into<PathBuf>) -> Self {
Self::Write { source, path: path.into() }
}
pub fn read(source: io::Error, path: impl Into<PathBuf>) -> Self {
Self::Read { source, path: path.into() }
}
pub fn copy(source: io::Error, from: impl Into<PathBuf>, to: impl Into<PathBuf>) -> Self {
Self::Copy { source, from: from.into(), to: to.into() }
}
pub fn read_link(source: io::Error, path: impl Into<PathBuf>) -> Self {
Self::ReadLink { source, path: path.into() }
}
pub fn create_file(source: io::Error, path: impl Into<PathBuf>) -> Self {
Self::CreateFile { source, path: path.into() }
}
pub fn remove_file(source: io::Error, path: impl Into<PathBuf>) -> Self {
Self::RemoveFile { source, path: path.into() }
}
pub fn create_dir(source: io::Error, path: impl Into<PathBuf>) -> Self {
Self::CreateDir { source, path: path.into() }
}
pub fn remove_dir(source: io::Error, path: impl Into<PathBuf>) -> Self {
Self::RemoveDir { source, path: path.into() }
}
pub fn open(source: io::Error, path: impl Into<PathBuf>) -> Self {
Self::Open { source, path: path.into() }
}
}
impl AsRef<Path> for FsPathError {
fn as_ref(&self) -> &Path {
match self {
Self::Write { path, .. } |
Self::Read { path, .. } |
Self::ReadLink { path, .. } |
Self::Copy { from: path, .. } |
Self::CreateDir { path, .. } |
Self::RemoveDir { path, .. } |
Self::CreateFile { path, .. } |
Self::RemoveFile { path, .. } |
Self::Open { path, .. } |
Self::ReadJson { path, .. } |
Self::WriteJson { path, .. } => path,
}
}
}
impl From<FsPathError> for io::Error {
fn from(value: FsPathError) -> Self {
match value {
FsPathError::Write { source, .. } |
FsPathError::Read { source, .. } |
FsPathError::ReadLink { source, .. } |
FsPathError::Copy { source, .. } |
FsPathError::CreateDir { source, .. } |
FsPathError::RemoveDir { source, .. } |
FsPathError::CreateFile { source, .. } |
FsPathError::RemoveFile { source, .. } |
FsPathError::Open { source, .. } => source,
FsPathError::ReadJson { source, .. } | FsPathError::WriteJson { source, .. } => {
source.into()
}
}
}
}