use rocket::http::Method;
use rocket::response::Redirect;
use rocket::route::{Handler, Outcome};
use rocket::{Data, Request, Route};
#[derive(Clone)]
pub struct RedirectHandler {
dest: &'static str,
}
impl RedirectHandler {
#[must_use]
pub fn to(dest: &'static str) -> Self {
Self {
dest: dest.trim_start_matches('/'),
}
}
pub fn into_route(self, path: impl AsRef<str>) -> Route {
Route::new(Method::Get, path.as_ref(), self)
}
}
#[rocket::async_trait]
impl Handler for RedirectHandler {
async fn handle<'r>(&self, req: &'r Request<'_>, _: Data<'r>) -> Outcome<'r> {
let path = req.route().unwrap().uri.base().trim_end_matches('/');
Outcome::from(req, Redirect::to(format!("{}/{}", path, self.dest)))
}
}