aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/ui/error.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/routes/ui/error.rs')
-rw-r--r--server/src/routes/ui/error.rs32
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)
}
}