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