1 #[cfg(feature = "csv_output")] 2 use csv::Error as CsvError; 3 use serde_json::Error as SerdeError; 4 use std::error::Error as StdError; 5 use std::fmt; 6 use std::io; 7 use std::path::PathBuf; 8 9 #[allow(clippy::enum_variant_names)] 10 #[derive(Debug)] 11 pub enum Error { 12 AccessError { 13 path: PathBuf, 14 inner: io::Error, 15 }, 16 CopyError { 17 from: PathBuf, 18 to: PathBuf, 19 inner: io::Error, 20 }, 21 SerdeError { 22 path: PathBuf, 23 inner: SerdeError, 24 }, 25 #[cfg(feature = "csv_output")] 26 /// This API requires the following crate features to be activated: csv_output 27 CsvError(CsvError), 28 } 29 impl fmt::Display for Error { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result30 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 31 match self { 32 Error::AccessError { path, inner } => { 33 write!(f, "Failed to access file {:?}: {}", path, inner) 34 } 35 Error::CopyError { from, to, inner } => { 36 write!(f, "Failed to copy file {:?} to {:?}: {}", from, to, inner) 37 } 38 Error::SerdeError { path, inner } => write!( 39 f, 40 "Failed to read or write file {:?} due to serialization error: {}", 41 path, inner 42 ), 43 #[cfg(feature = "csv_output")] 44 Error::CsvError(inner) => write!(f, "CSV error: {}", inner), 45 } 46 } 47 } 48 impl StdError for Error { description(&self) -> &str49 fn description(&self) -> &str { 50 match self { 51 Error::AccessError { .. } => "AccessError", 52 Error::CopyError { .. } => "CopyError", 53 Error::SerdeError { .. } => "SerdeError", 54 #[cfg(feature = "csv_output")] 55 Error::CsvError(_) => "CsvError", 56 } 57 } 58 cause(&self) -> Option<&dyn StdError>59 fn cause(&self) -> Option<&dyn StdError> { 60 match self { 61 Error::AccessError { inner, .. } => Some(inner), 62 Error::CopyError { inner, .. } => Some(inner), 63 Error::SerdeError { inner, .. } => Some(inner), 64 #[cfg(feature = "csv_output")] 65 Error::CsvError(inner) => Some(inner), 66 } 67 } 68 } 69 70 #[cfg(feature = "csv_output")] 71 impl From<CsvError> for Error { from(other: CsvError) -> Error72 fn from(other: CsvError) -> Error { 73 Error::CsvError(other) 74 } 75 } 76 77 pub type Result<T> = ::std::result::Result<T, Error>; 78 log_error(e: &Error)79 pub(crate) fn log_error(e: &Error) { 80 error!("error: {}", e); 81 } 82