1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
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; #[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); }