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