diff options
Diffstat (limited to 'src/channel/routes.rs')
| -rw-r--r-- | src/channel/routes.rs | 24 |
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(), + } + } +} |
