use std::{
fmt::{self, Display, Formatter},
io,
path::PathBuf,
str::Utf8Error,
time::SystemTimeError,
};
#[non_exhaustive]
#[derive(Debug)]
pub enum Error {
FindEmailError(String),
InvalidFilenameError(String),
CopyEmailSamePathError(PathBuf),
NoParentError(PathBuf),
InvalidIdError(String),
InvalidFolderError(String),
InvalidFlagError(char),
AlreadyExistsError(PathBuf),
Utf8Error(Utf8Error),
IoError(io::Error),
SystemTimeError(SystemTimeError),
}
impl Display for Error {
fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
use Error::*;
match self {
FindEmailError(id) => write!(f, "cannot find email {id}"),
InvalidFilenameError(filename) => {
write!(f, "cannot get email from invalid file {filename}")
}
CopyEmailSamePathError(path) => {
write!(f, "cannot copy email to the same path {}", path.display())
}
NoParentError(path) => write!(f, "cannot get parent of {}", path.display()),
InvalidIdError(id) => write!(f, "invalid id {id}"),
InvalidFolderError(folder) => write!(f, "invalid folder {folder}"),
InvalidFlagError(flag) => write!(f, "invalid flag {flag}"),
AlreadyExistsError(path) => write!(f, "{} already exists", path.display()),
Utf8Error(err) => write!(f, "{err}"),
IoError(err) => write!(f, "{err}"),
SystemTimeError(err) => write!(f, "{err}"),
}
}
}
impl std::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Error::FindEmailError(_) => None,
Error::InvalidFilenameError(_) => None,
Error::CopyEmailSamePathError(_) => None,
Error::NoParentError(_) => None,
Error::InvalidIdError(_) => None,
Error::InvalidFolderError(_) => None,
Error::InvalidFlagError(_) => None,
Error::AlreadyExistsError(_) => None,
Error::Utf8Error(err) => Some(err),
Error::IoError(err) => Some(err),
Error::SystemTimeError(err) => Some(err),
}
}
}
impl From<Utf8Error> for Error {
fn from(err: Utf8Error) -> Self {
Error::Utf8Error(err)
}
}
impl From<io::Error> for Error {
fn from(err: io::Error) -> Self {
Error::IoError(err)
}
}
impl From<SystemTimeError> for Error {
fn from(err: SystemTimeError) -> Self {
Error::SystemTimeError(err)
}
}