use crate::context::Request;
use crate::flash::Message;
use crate::utils::aliases::AEngine;
use crate::utils::csrf::CsrfToken;
use axum::{extract::FromRequestParts, http::StatusCode, http::request::Parts};
use tower_sessions::Session;
pub struct RuniqueContext {
pub engine: AEngine,
pub tpl: Request,
pub flash: Message,
}
impl<S> FromRequestParts<S> for RuniqueContext
where
S: Send + Sync,
{
type Rejection = StatusCode;
async fn from_request_parts(parts: &mut Parts, _state: &S) -> Result<Self, Self::Rejection> {
let engine = parts
.extensions
.get::<AEngine>()
.ok_or(StatusCode::INTERNAL_SERVER_ERROR)?;
let session = parts
.extensions
.get::<Session>()
.ok_or(StatusCode::INTERNAL_SERVER_ERROR)?;
let csrf_token = parts
.extensions
.get::<CsrfToken>()
.cloned()
.ok_or(StatusCode::INTERNAL_SERVER_ERROR)?;
Ok(Self {
engine: engine.clone(),
tpl: Request::new(
engine.clone(),
session.clone(),
csrf_token,
parts.method.clone(),
),
flash: Message {
session: session.clone(),
},
})
}
}