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