use axum::{ extract::FromRequestParts, http::request::Parts, response::{IntoResponse as _, Redirect, Response}, }; use interim_models::lens::Lens; use crate::{app_error::AppError, app_state::AppState}; /// Helper type for semantically generating URI paths, e.g. for redirects. #[derive(Clone, Debug)] pub struct Navigator { root_path: String, sub_path: String, } impl Navigator { pub fn lens_page(&self, lens: &Lens) -> Self { Self { sub_path: format!( "/d/{0}/r/{1}/l/{2}/", lens.base_id.simple(), lens.class_oid.0, lens.id.simple() ), ..self.clone() } } pub fn redirect_to(&self) -> Response { Redirect::to(&format!("{0}{1}", self.root_path, self.sub_path)).into_response() } } impl FromRequestParts for Navigator where S: Into + Clone + Sync, { type Rejection = AppError; async fn from_request_parts(_: &mut Parts, state: &S) -> Result { let app_state: AppState = state.clone().into(); Ok(Navigator { root_path: app_state.settings.root_path.clone(), sub_path: "/".to_owned(), }) } }