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