summaryrefslogtreecommitdiff
path: root/src/channel/routes.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/channel/routes.rs')
-rw-r--r--src/channel/routes.rs24
1 files changed, 21 insertions, 3 deletions
diff --git a/src/channel/routes.rs b/src/channel/routes.rs
index 1379153..847e0b4 100644
--- a/src/channel/routes.rs
+++ b/src/channel/routes.rs
@@ -1,10 +1,12 @@
use axum::{
extract::{Form, Path, State},
- response::{IntoResponse, Redirect},
+ http::StatusCode,
+ response::{IntoResponse, Redirect, Response},
routing::post,
Router,
};
+use super::app::EventsError;
use crate::{
app::App,
clock::RequestedAt,
@@ -44,10 +46,26 @@ async fn on_send(
State(app): State<App>,
login: Login,
Form(form): Form<SendRequest>,
-) -> Result<impl IntoResponse, InternalError> {
+) -> Result<impl IntoResponse, ErrorResponse> {
app.channels()
.send(&login, &channel, &form.message, &sent_at)
- .await?;
+ .await
+ // Could impl `From` here, but it's more code and this is used once.
+ .map_err(ErrorResponse)?;
Ok(Redirect::to(&format!("/{}", channel)))
}
+
+struct ErrorResponse(EventsError);
+
+impl IntoResponse for ErrorResponse {
+ fn into_response(self) -> Response {
+ let Self(error) = self;
+ match error {
+ not_found @ EventsError::ChannelNotFound(_) => {
+ (StatusCode::NOT_FOUND, not_found.to_string()).into_response()
+ }
+ EventsError::DatabaseError(error) => InternalError::from(error).into_response(),
+ }
+ }
+}