use crate::template_utils::{IntoContext, Ructe}; use plume_models::{db_conn::DbConn, Error, PlumeRocket}; use rocket::{ response::{self, Responder}, Request, }; use tracing::warn; #[derive(Debug)] pub struct ErrorPage(Error); impl From for ErrorPage { fn from(err: Error) -> ErrorPage { ErrorPage(err) } } impl<'r> Responder<'r> for ErrorPage { fn respond_to(self, req: &Request<'_>) -> response::Result<'r> { let conn = req.guard::().unwrap(); let rockets = req.guard::().unwrap(); match self.0 { Error::NotFound => { render!(errors::not_found(&(&conn, &rockets).to_context())).respond_to(req) } Error::Unauthorized => { render!(errors::not_found(&(&conn, &rockets).to_context())).respond_to(req) } _ => render!(errors::not_found(&(&conn, &rockets).to_context())).respond_to(req), } } } #[catch(404)] pub fn not_found(req: &Request<'_>) -> Ructe { let conn = req.guard::().unwrap(); let rockets = req.guard::().unwrap(); render!(errors::not_found(&(&conn, &rockets).to_context())) } #[catch(422)] pub fn unprocessable_entity(req: &Request<'_>) -> Ructe { let conn = req.guard::().unwrap(); let rockets = req.guard::().unwrap(); render!(errors::unprocessable_entity( &(&conn, &rockets).to_context() )) } #[catch(500)] pub fn server_error(req: &Request<'_>) -> Ructe { let conn = req.guard::().unwrap(); let rockets = req.guard::().unwrap(); render!(errors::server_error(&(&conn, &rockets).to_context())) } #[post("/csrf-violation?")] pub fn csrf_violation(target: Option, conn: DbConn, rockets: PlumeRocket) -> Ructe { if let Some(uri) = target { warn!("Csrf violation while accessing \"{}\"", uri) } render!(errors::csrf(&(&conn, &rockets).to_context())) }