diff options
Diffstat (limited to 'server/src/routes/ui/error.rs')
-rw-r--r-- | server/src/routes/ui/error.rs | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/server/src/routes/ui/error.rs b/server/src/routes/ui/error.rs new file mode 100644 index 0000000..2a1f8e6 --- /dev/null +++ b/server/src/routes/ui/error.rs @@ -0,0 +1,59 @@ +use super::{layout::Layout, HtmlTemplate}; +use markup::Render; +use rocket::http::Status; +use rocket::{ + catch, + http::ContentType, + response::{self, Responder}, + Request, Response, +}; +use std::{fmt::Display, io::Cursor}; + +#[catch(default)] +pub fn r_not_found<'a>(status: Status, _request: &Request) -> HtmlTemplate<markup::DynRender<'a>> { + HtmlTemplate( + "Not found".to_string(), + markup::new! { + h2 { "Error" } + p { @format!("{status:?}") } + }, + ) +} + +#[derive(Debug)] +pub struct MyError(anyhow::Error); + +impl<'r> Responder<'r, 'static> for MyError { + fn respond_to(self, _: &'r Request<'_>) -> response::Result<'static> { + let mut out = String::new(); + Layout { + title: "Error".to_string(), + main: markup::new! { + h2 { "An error occured. Nobody is sorry"} + pre.error { @format!("{:?}", self.0) } + }, + } + .render(&mut out) + .unwrap(); + Response::build() + .header(ContentType::HTML) + .streamed_body(Cursor::new(out)) + .ok() + } +} + +impl Display for MyError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.0.fmt(f) + } +} +impl From<anyhow::Error> for MyError { + fn from(err: anyhow::Error) -> MyError { + MyError(err) + } +} +impl From<std::fmt::Error> for MyError { + fn from(err: std::fmt::Error) -> MyError { + MyError(anyhow::anyhow!("{err}")) + } +} |