summaryrefslogtreecommitdiff
path: root/src/error.rs
diff options
context:
space:
mode:
authorOwen Jacobson <owen@grimoire.ca>2024-09-03 01:25:20 -0400
committerOwen Jacobson <owen@grimoire.ca>2024-09-03 02:09:25 -0400
commitb404344a7c4ab5cb6c7d7b445fab796be79b848f (patch)
treec476b125316b9d4aa7bdece7c9bb8e2f65d2961e /src/error.rs
parent92a7518975c6bc4b2f9b9c6c12c458b24e8cfaf5 (diff)
Allow login creation and authentication.
This is a beefy change, as it adds a TON of smaller pieces needed to make this all function: * A database migration. * A ton of new crates for things like password validation, timekeeping, and HTML generation. * A first cut at a module structure for routes, templates, repositories. * A family of ID types, for identifying various kinds of domain thing. * AppError, which _doesn't_ implement Error but can be sent to clients.
Diffstat (limited to 'src/error.rs')
-rw-r--r--src/error.rs37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/error.rs b/src/error.rs
new file mode 100644
index 0000000..2d512e6
--- /dev/null
+++ b/src/error.rs
@@ -0,0 +1,37 @@
+use std::error;
+
+use axum::{
+ http::StatusCode,
+ response::{IntoResponse, Response},
+};
+
+// I'm making an effort to avoid `anyhow` here, as that crate is _enormously_
+// complex (though very usable). We don't need to be overly careful about
+// allocations on errors in this app, so this is fine for most "general
+// failure" cases.
+//
+// If that changes, my hope is to use `thiserror` or something with a similar
+// strategy, before resorting to `anyhow`.
+pub type BoxedError = Box<dyn error::Error + Send + Sync>;
+
+// Returns a 500 Internal Server Error to the client. Meant to be used via the
+// `?` operator; _does not_ return the originating error to the client.
+#[derive(Debug)]
+pub struct InternalError;
+
+impl<E> From<E> for InternalError
+where
+ E: Into<BoxedError>,
+{
+ fn from(_: E) -> InternalError {
+ // At some point it may be useful for this to record the originating
+ // error so that it can be logged… -oj
+ InternalError
+ }
+}
+
+impl IntoResponse for InternalError {
+ fn into_response(self) -> Response {
+ (StatusCode::INTERNAL_SERVER_ERROR, "internal server error").into_response()
+ }
+}