Commit

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)

fix regression in error handler
fix regression in error handler

This fixes a regression I introduced into the error handler, it also
simplifies what was a very confusing design.
1diff --git a/src/web2/error.rs b/src/web2/error.rs
2index 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
118index 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());