use std::path::PathBuf;
use thiserror::Error;
#[derive(Error, Debug)]
pub enum NavError {
#[error("path not found: {0}")]
NotFound(PathBuf),
#[error("not a directory: {0}")]
NotADirectory(PathBuf),
#[error("permission denied: {0}")]
PermissionDenied(PathBuf),
#[error("invalid name: {0}")]
InvalidName(String),
#[error("no pending operation")]
NoPendingOperation,
#[error("no history")]
NoHistory,
#[error("I/O error at {path}: {source}")]
Io {
path: PathBuf,
#[source]
source: std::io::Error,
},
}
impl NavError {
pub fn io(path: impl Into<PathBuf>, source: std::io::Error) -> Self {
Self::Io {
path: path.into(),
source,
}
}
pub fn from_error_with_path(err: crate::Error, path: impl Into<PathBuf>) -> Self {
match err {
crate::Error::NotFound(p) => NavError::NotFound(p),
crate::Error::NotDirectory(p) => NavError::NotADirectory(p),
crate::Error::Io(io_err) => NavError::Io {
path: path.into(),
source: io_err,
},
}
}
}
impl From<crate::Error> for NavError {
fn from(err: crate::Error) -> Self {
match err {
crate::Error::NotFound(path) => NavError::NotFound(path),
crate::Error::NotDirectory(path) => NavError::NotADirectory(path),
crate::Error::Io(io_err) => NavError::Io {
path: PathBuf::new(),
source: io_err,
},
}
}
}