diff options
Diffstat (limited to 'server/src/routes/ui/error.rs')
-rw-r--r-- | server/src/routes/ui/error.rs | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/server/src/routes/ui/error.rs b/server/src/routes/ui/error.rs index 88573a6..190650f 100644 --- a/server/src/routes/ui/error.rs +++ b/server/src/routes/ui/error.rs @@ -7,10 +7,11 @@ use super::layout::{DynLayoutPage, LayoutPage}; use crate::{routes::ui::account::rocket_uri_macro_r_account_login, uri}; use rocket::{ catch, - http::Status, + http::{MediaType, Status}, response::{self, Responder}, Request, }; +use serde_json::{json, Value}; use std::fmt::Display; #[catch(default)] @@ -28,6 +29,11 @@ pub fn r_catch<'a>(status: Status, _request: &Request) -> DynLayoutPage<'a> { } } +#[catch(default)] +pub fn r_api_catch<'a>(status: Status, _request: &Request) -> Value { + json!({ "error": format!("{status}") }) +} + pub type MyResult<T> = Result<T, MyError>; #[derive(Debug)] @@ -35,15 +41,23 @@ pub struct MyError(pub anyhow::Error); impl<'r> Responder<'r, 'static> for MyError { fn respond_to(self, req: &'r Request<'_>) -> response::Result<'static> { - LayoutPage { - title: "Error".to_string(), - content: markup::new! { - h2 { "An error occured. Nobody is sorry"} - pre.error { @format!("{:?}", self.0) } - }, - ..Default::default() + if req + .accept() + .map(|a| a.preferred().exact_eq(&MediaType::JSON)) + .unwrap_or(true) + { + json!({ "error": format!("{}", self.0) }).respond_to(req) + } else { + LayoutPage { + title: "Error".to_string(), + content: markup::new! { + h2 { "An error occured. Nobody is sorry"} + pre.error { @format!("{:?}", self.0) } + }, + ..Default::default() + } + .respond_to(req) } - .respond_to(req) } } |