1use std::{fmt, io, path::PathBuf, str};
2
3#[derive(Debug)]
4pub enum Error {
5 Notify(notify::Error),
6 IO(io::Error),
7 RescanRequired,
8 Lmdb(lmdb::Error),
9 Capnp(capnp::Error),
10 NotInSchema(capnp::NotInSchema),
11 BincodeError(bincode::ErrorKind),
12 RonError(ron::Error),
13 ErasedSerde(erased_serde::Error),
14 MetaDeError(PathBuf, ron::Error),
15 SetLoggerError(log::SetLoggerError),
16 UuidLength,
17 RecvError,
18 SendError,
19 Exit,
20 ImporterError(distill_importer::Error),
21 StrUtf8Error(str::Utf8Error),
22 Custom(String),
23}
24
25pub type Result<T> = std::result::Result<T, Error>;
26
27impl std::error::Error for Error {
28 fn cause(&self) -> Option<&dyn std::error::Error> {
29 match *self {
30 Error::Notify(ref e) => Some(e),
31 Error::IO(ref e) => Some(e),
32 Error::RescanRequired => None,
33 Error::Lmdb(ref e) => Some(e),
34 Error::Capnp(ref e) => Some(e),
35 Error::NotInSchema(ref e) => Some(e),
36 Error::BincodeError(ref e) => Some(e),
37 Error::ErasedSerde(ref e) => Some(e),
38 Error::RonError(ref e) => Some(e),
39 Error::MetaDeError(_, ref e) => Some(e),
40 Error::SetLoggerError(ref e) => Some(e),
41 Error::UuidLength => None,
42 Error::RecvError => None,
43 Error::SendError => None,
44 Error::Exit => None,
45 Error::ImporterError(ref e) => Some(e),
46 Error::StrUtf8Error(ref e) => Some(e),
47 Error::Custom(ref _e) => None,
48 }
49 }
50}
51impl fmt::Display for Error {
52 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
53 match *self {
54 Error::Notify(ref e) => e.fmt(f),
55 Error::IO(ref e) => e.fmt(f),
56 Error::RescanRequired => write!(f, "{}", self),
57 Error::Lmdb(ref e) => e.fmt(f),
58 Error::Capnp(ref e) => e.fmt(f),
59 Error::NotInSchema(ref e) => e.fmt(f),
60 Error::BincodeError(ref e) => e.fmt(f),
61 Error::ErasedSerde(ref e) => e.fmt(f),
62 Error::RonError(ref e) => e.fmt(f),
63 Error::MetaDeError(ref path, ref e) => {
64 write!(f, "metadata {} ", path.display())?;
65 e.fmt(f)
66 }
67 Error::SetLoggerError(ref e) => e.fmt(f),
68 Error::UuidLength => write!(f, "{}", self),
69 Error::RecvError => write!(f, "{}", self),
70 Error::SendError => write!(f, "{}", self),
71 Error::Exit => write!(f, "{}", self),
72 Error::ImporterError(ref e) => e.fmt(f),
73 Error::StrUtf8Error(ref e) => e.fmt(f),
74 Error::Custom(ref s) => f.write_str(s.as_str()),
75 }
76 }
77}
78impl From<notify::Error> for Error {
79 fn from(err: notify::Error) -> Error {
80 Error::Notify(err)
81 }
82}
83impl From<io::Error> for Error {
84 fn from(err: io::Error) -> Error {
85 Error::IO(err)
86 }
87}
88impl From<lmdb::Error> for Error {
89 fn from(err: lmdb::Error) -> Error {
90 Error::Lmdb(err)
91 }
92}
93impl From<capnp::Error> for Error {
94 fn from(err: capnp::Error) -> Error {
95 Error::Capnp(err)
96 }
97}
98impl From<capnp::NotInSchema> for Error {
99 fn from(err: capnp::NotInSchema) -> Error {
100 Error::NotInSchema(err)
101 }
102}
103impl From<Box<bincode::ErrorKind>> for Error {
104 fn from(err: Box<bincode::ErrorKind>) -> Error {
105 Error::BincodeError(*err)
106 }
107}
108impl From<ron::Error> for Error {
109 fn from(err: ron::Error) -> Error {
110 Error::RonError(err)
111 }
112}
113
114impl From<erased_serde::Error> for Error {
115 fn from(err: erased_serde::Error) -> Error {
116 Error::ErasedSerde(err)
117 }
118}
119impl From<Error> for capnp::Error {
120 fn from(err: Error) -> capnp::Error {
121 capnp::Error::failed(format!("{}", err))
122 }
123}
124impl From<log::SetLoggerError> for Error {
125 fn from(err: log::SetLoggerError) -> Error {
126 Error::SetLoggerError(err)
127 }
128}
129impl From<distill_importer::Error> for Error {
130 fn from(err: distill_importer::Error) -> Error {
131 Error::ImporterError(err)
132 }
133}
134impl From<str::Utf8Error> for Error {
135 fn from(err: str::Utf8Error) -> Error {
136 Error::StrUtf8Error(err)
137 }
138}