neon_arch
commited on
Commit
•
c2280b7
1
Parent(s):
4460730
chore: add source and an appropriate message to different error variants
Browse files- src/engines/engine_models.rs +37 -10
src/engines/engine_models.rs
CHANGED
@@ -13,12 +13,15 @@ use scraper::error::SelectorErrorKind;
|
|
13 |
/// search engines.
|
14 |
/// * `UnexpectedError` - This variant handles all the errors which are unexpected or occur rarely
|
15 |
/// and are errors mostly related to failure in initialization of HeaderMap, Selector errors and
|
16 |
-
/// all other errors
|
17 |
#[derive(Debug)]
|
18 |
pub enum EngineErrorKind {
|
19 |
RequestError(reqwest::Error),
|
20 |
EmptyResultSet,
|
21 |
-
UnexpectedError
|
|
|
|
|
|
|
22 |
}
|
23 |
|
24 |
/// Implementing `Display` trait to make errors writable on the stdout and also providing/passing the
|
@@ -26,29 +29,53 @@ pub enum EngineErrorKind {
|
|
26 |
impl std::fmt::Display for EngineErrorKind {
|
27 |
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
28 |
match self {
|
29 |
-
EngineErrorKind::RequestError(request_error) =>
|
|
|
|
|
30 |
EngineErrorKind::EmptyResultSet => {
|
31 |
write!(f, "The upstream search engine returned an empty result set")
|
32 |
}
|
33 |
-
EngineErrorKind::UnexpectedError
|
|
|
|
|
|
|
|
|
|
|
|
|
34 |
}
|
35 |
}
|
36 |
}
|
37 |
|
38 |
-
/// Implementing `Error` trait to make the the `EngineErrorKind` enum an error type
|
39 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
|
41 |
/// Implementing `From` trait to map the `SelectorErrorKind` to `UnexpectedError` variant.
|
42 |
-
impl
|
43 |
-
fn from(err: SelectorErrorKind<'
|
44 |
-
Self::UnexpectedError
|
|
|
|
|
|
|
45 |
}
|
46 |
}
|
47 |
|
48 |
/// Implementing `From` trait to map the `InvalidHeaderValue` to `UnexpectedError` variant.
|
49 |
impl From<InvalidHeaderValue> for EngineErrorKind {
|
50 |
fn from(err: InvalidHeaderValue) -> Self {
|
51 |
-
Self::UnexpectedError
|
|
|
|
|
|
|
52 |
}
|
53 |
}
|
54 |
|
|
|
13 |
/// search engines.
|
14 |
/// * `UnexpectedError` - This variant handles all the errors which are unexpected or occur rarely
|
15 |
/// and are errors mostly related to failure in initialization of HeaderMap, Selector errors and
|
16 |
+
/// all other errors occuring within the code handling the `upstream search engines`.
|
17 |
#[derive(Debug)]
|
18 |
pub enum EngineErrorKind {
|
19 |
RequestError(reqwest::Error),
|
20 |
EmptyResultSet,
|
21 |
+
UnexpectedError {
|
22 |
+
message: String,
|
23 |
+
source: Option<Box<dyn std::error::Error>>,
|
24 |
+
},
|
25 |
}
|
26 |
|
27 |
/// Implementing `Display` trait to make errors writable on the stdout and also providing/passing the
|
|
|
29 |
impl std::fmt::Display for EngineErrorKind {
|
30 |
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
31 |
match self {
|
32 |
+
EngineErrorKind::RequestError(request_error) => {
|
33 |
+
write!(f, "Request error: {}", request_error)
|
34 |
+
}
|
35 |
EngineErrorKind::EmptyResultSet => {
|
36 |
write!(f, "The upstream search engine returned an empty result set")
|
37 |
}
|
38 |
+
EngineErrorKind::UnexpectedError { message, source } => {
|
39 |
+
write!(f, "Unexpected error: {}", message)?;
|
40 |
+
if let Some(source) = source {
|
41 |
+
write!(f, "\nCaused by: {}", source)?;
|
42 |
+
}
|
43 |
+
Ok(())
|
44 |
+
}
|
45 |
}
|
46 |
}
|
47 |
}
|
48 |
|
49 |
+
/// Implementing `Error` trait to make the the `EngineErrorKind` enum an error type and
|
50 |
+
/// mapping `ReqwestErrors` to `RequestError` and `UnexpectedError` errors to all other unexpected
|
51 |
+
/// errors ocurring within the code handling the upstream search engines.
|
52 |
+
impl std::error::Error for EngineErrorKind {
|
53 |
+
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
|
54 |
+
match self {
|
55 |
+
EngineErrorKind::RequestError(request_error) => Some(request_error),
|
56 |
+
EngineErrorKind::UnexpectedError { source, .. } => source.as_deref().map(|s| s),
|
57 |
+
_ => None,
|
58 |
+
}
|
59 |
+
}
|
60 |
+
}
|
61 |
|
62 |
/// Implementing `From` trait to map the `SelectorErrorKind` to `UnexpectedError` variant.
|
63 |
+
impl From<SelectorErrorKind<'_>> for EngineErrorKind {
|
64 |
+
fn from(err: SelectorErrorKind<'_>) -> Self {
|
65 |
+
Self::UnexpectedError {
|
66 |
+
message: err.to_string(),
|
67 |
+
source: None,
|
68 |
+
}
|
69 |
}
|
70 |
}
|
71 |
|
72 |
/// Implementing `From` trait to map the `InvalidHeaderValue` to `UnexpectedError` variant.
|
73 |
impl From<InvalidHeaderValue> for EngineErrorKind {
|
74 |
fn from(err: InvalidHeaderValue) -> Self {
|
75 |
+
Self::UnexpectedError {
|
76 |
+
message: err.to_string(),
|
77 |
+
source: Some(Box::new(err)),
|
78 |
+
}
|
79 |
}
|
80 |
}
|
81 |
|