Author:
Hash:
Timestamp:
+23 -56 +/-2 browse
Kevin Schoon [me@kevinschoon.com]
39ee5ff93469007a36a20e0c6d76f49f764af940
Fri, 12 Jan 2024 18:04:04 +0000 (1.3 years ago)
1 | diff --git a/src/web2/error.rs b/src/web2/error.rs |
2 | index fce97c3..3936d7b 100644 |
3 | --- a/src/web2/error.rs |
4 | +++ b/src/web2/error.rs |
5 | @@ -9,21 +9,18 @@ use ayllu_database::Error as SqlError; |
6 | use ayllu_git::Error as GitError; |
7 | use ayllu_rpc::Error as RpcError; |
8 | |
9 | - #[derive(Debug)] |
10 | + /// Error maps known error types into errors that can be translated into HTTP |
11 | + /// status codes, e.g. Io::NotFound -> 404 |
12 | + #[derive(Debug, Clone)] |
13 | pub enum Error { |
14 | Message(String), |
15 | NotFound(String), |
16 | - Rpc(RpcError), |
17 | - Git(GitError), |
18 | - Tera(TeraError), |
19 | - Io(IoError), |
20 | - Sql(SqlError), |
21 | } |
22 | |
23 | impl IntoResponse for Error { |
24 | - // TODO: this makes absolutely no sense |
25 | fn into_response(self) -> Response { |
26 | Response::builder() |
27 | + .extension(self) |
28 | .body(Body::empty()) |
29 | .unwrap() |
30 | } |
31 | @@ -37,31 +34,38 @@ impl From<Box<dyn StdError>> for Error { |
32 | |
33 | impl From<RpcError> for Error { |
34 | fn from(value: RpcError) -> Self { |
35 | - Error::Rpc(value) |
36 | + Error::Message(format!("RPC: {:?}", value)) |
37 | } |
38 | } |
39 | |
40 | impl From<TeraError> for Error { |
41 | fn from(value: TeraError) -> Self { |
42 | - Error::Tera(value) |
43 | + Error::Message(format!("Templating: {:?}", value)) |
44 | } |
45 | } |
46 | |
47 | impl From<GitError> for Error { |
48 | fn from(value: GitError) -> Self { |
49 | - Error::Git(value) |
50 | + if value.not_found() { |
51 | + Error::NotFound(format!("GIT: {:?}", value)) |
52 | + } else { |
53 | + Error::Message(format!("GIT: {:?}", value)) |
54 | + } |
55 | } |
56 | } |
57 | |
58 | impl From<IoError> for Error { |
59 | fn from(value: IoError) -> Self { |
60 | - Error::Io(value) |
61 | + match value.kind() { |
62 | + std::io::ErrorKind::NotFound => Error::NotFound(format!("IO: {}", value.to_string())), |
63 | + _ => Error::Message(format!("IO: {:?}", value)), |
64 | + } |
65 | } |
66 | } |
67 | |
68 | impl From<SqlError> for Error { |
69 | fn from(value: SqlError) -> Self { |
70 | - Error::Sql(value) |
71 | + Error::Message(format!("SQL: {:?}", value)) |
72 | } |
73 | } |
74 | |
75 | @@ -70,11 +74,6 @@ impl StdError for Error { |
76 | match self { |
77 | Error::Message(_) => None, |
78 | Error::NotFound(_) => None, |
79 | - Error::Git(err) => Some(err), |
80 | - Error::Tera(err) => Some(err), |
81 | - Error::Io(err) => Some(err), |
82 | - Error::Rpc(err) => Some(err), |
83 | - Error::Sql(err) => Some(err), |
84 | } |
85 | } |
86 | } |
87 | @@ -82,27 +81,8 @@ impl StdError for Error { |
88 | impl Display for Error { |
89 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
90 | match self { |
91 | - Error::Message(err) => { |
92 | - write!(f, "{:?}", err) |
93 | - } |
94 | - Error::NotFound(err) => { |
95 | - write!(f, "{:?}", err) |
96 | - } |
97 | - Error::Git(err) => { |
98 | - write!(f, "{:?}", err) |
99 | - } |
100 | - Error::Tera(err) => { |
101 | - write!(f, "{:?}", err) |
102 | - } |
103 | - Error::Io(err) => { |
104 | - write!(f, "{:?}", err) |
105 | - } |
106 | - Error::Rpc(err) => { |
107 | - write!(f, "{:?}", err) |
108 | - } |
109 | - Error::Sql(err) => { |
110 | - write!(f, "{:?}", err) |
111 | - } |
112 | + Error::Message(message) => write!(f, "{}", message), |
113 | + Error::NotFound(message) => write!(f, "{}", message), |
114 | } |
115 | } |
116 | } |
117 | diff --git a/src/web2/middleware/error.rs b/src/web2/middleware/error.rs |
118 | index 12dbfa6..4b33ab8 100644 |
119 | --- a/src/web2/middleware/error.rs |
120 | +++ b/src/web2/middleware/error.rs |
121 | @@ -22,23 +22,10 @@ pub async fn middleware( |
122 | ) -> Response { |
123 | let response = next.run(req).await; |
124 | if let Some(error) = response.extensions().get::<Error>() { |
125 | - let mut status_code = StatusCode::INTERNAL_SERVER_ERROR; |
126 | - match error { |
127 | - Error::Git(git_error) => { |
128 | - if git_error.not_found() { |
129 | - status_code = StatusCode::NOT_FOUND; |
130 | - }; |
131 | - } |
132 | - Error::Io(io_error) => { |
133 | - if io_error.kind() == IoErrorKind::NotFound { |
134 | - status_code = StatusCode::NOT_FOUND; |
135 | - } |
136 | - } |
137 | - _ => { |
138 | - status_code = StatusCode::INTERNAL_SERVER_ERROR; |
139 | - } |
140 | - } |
141 | - |
142 | + let status_code = match error { |
143 | + Error::Message(_) => StatusCode::INTERNAL_SERVER_ERROR, |
144 | + Error::NotFound(_) => StatusCode::NOT_FOUND, |
145 | + }; |
146 | // reload the theme since the middleware may not have ran yet |
147 | let loader = Loader { |
148 | templates: state.1.clone(), |
149 | @@ -55,7 +42,7 @@ pub async fn middleware( |
150 | ctx.insert("status_code", status_code.as_str()); |
151 | ctx.insert("error_message", &error.to_string()); |
152 | let template_str = if status_code == StatusCode::NOT_FOUND { |
153 | - log::warn!("Error: {}", error.to_string()); |
154 | + log::warn!("Not Found: {}", error.to_string()); |
155 | template.render("404.html", &ctx).unwrap() |
156 | } else { |
157 | log::error!("Error: {}", error.to_string()); |