use std::io;
use std::path::{Path, PathBuf};
#[derive(Debug, Clone)]
pub enum Error {
Io {
path: PathBuf,
kind: io::ErrorKind,
message: String,
},
}
impl Error {
pub(crate) fn io(path: impl Into<PathBuf>, kind: io::ErrorKind, message: String) -> Self {
Self::Io {
path: path.into(),
kind,
message,
}
}
pub fn path(&self) -> &Path {
match self {
Self::Io { path, .. } => path,
}
}
pub fn io_kind(&self) -> io::ErrorKind {
match self {
Self::Io { kind, .. } => *kind,
}
}
pub fn is_permission_denied(&self) -> bool {
self.io_kind() == io::ErrorKind::PermissionDenied
}
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Io { path, message, .. } => {
write!(f, "I/O error at {}: {}", path.display(), message)
}
}
}
}
impl std::error::Error for Error {}
impl From<&swdir::ScanError> for Error {
fn from(e: &swdir::ScanError) -> Self {
Self::io(e.path(), e.io_kind(), e.to_string())
}
}