74 lines
2.0 KiB
Rust
Executable File
74 lines
2.0 KiB
Rust
Executable File
use csv::Error as CsvError;
|
|
use serde_json::Error as SerdeError;
|
|
use std::error::Error as StdError;
|
|
use std::fmt;
|
|
use std::io;
|
|
use std::path::PathBuf;
|
|
|
|
#[allow(clippy::enum_variant_names)]
|
|
#[derive(Debug)]
|
|
pub enum Error {
|
|
AccessError {
|
|
path: PathBuf,
|
|
inner: io::Error,
|
|
},
|
|
CopyError {
|
|
from: PathBuf,
|
|
to: PathBuf,
|
|
inner: io::Error,
|
|
},
|
|
SerdeError {
|
|
path: PathBuf,
|
|
inner: SerdeError,
|
|
},
|
|
CsvError(CsvError),
|
|
}
|
|
impl fmt::Display for Error {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
match self {
|
|
Error::AccessError { path, inner } => {
|
|
write!(f, "Failed to access file {:?}: {}", path, inner)
|
|
}
|
|
Error::CopyError { from, to, inner } => {
|
|
write!(f, "Failed to copy file {:?} to {:?}: {}", from, to, inner)
|
|
}
|
|
Error::SerdeError { path, inner } => write!(
|
|
f,
|
|
"Failed to read or write file {:?} due to serialization error: {}",
|
|
path, inner
|
|
),
|
|
Error::CsvError(inner) => write!(f, "CSV error: {}", inner),
|
|
}
|
|
}
|
|
}
|
|
impl StdError for Error {
|
|
fn description(&self) -> &str {
|
|
match self {
|
|
Error::AccessError { .. } => "AccessError",
|
|
Error::CopyError { .. } => "CopyError",
|
|
Error::SerdeError { .. } => "SerdeError",
|
|
Error::CsvError(_) => "CsvError",
|
|
}
|
|
}
|
|
|
|
fn cause(&self) -> Option<&dyn StdError> {
|
|
match self {
|
|
Error::AccessError { inner, .. } => Some(inner),
|
|
Error::CopyError { inner, .. } => Some(inner),
|
|
Error::SerdeError { inner, .. } => Some(inner),
|
|
Error::CsvError(inner) => Some(inner),
|
|
}
|
|
}
|
|
}
|
|
impl From<CsvError> for Error {
|
|
fn from(other: CsvError) -> Error {
|
|
Error::CsvError(other)
|
|
}
|
|
}
|
|
|
|
pub type Result<T> = ::std::result::Result<T, Error>;
|
|
|
|
pub(crate) fn log_error(e: &Error) {
|
|
error!("error: {}", e);
|
|
}
|