use crate::types::{AuthRequest, HttpMethod, RequestMeta};
#[derive(Debug, Clone)]
pub struct RequestHookContext {
pub method: HttpMethod,
pub path: String,
pub headers: std::collections::HashMap<String, String>,
pub query: std::collections::HashMap<String, String>,
pub meta: RequestMeta,
}
impl RequestHookContext {
pub fn from_request(request: &AuthRequest) -> Self {
Self {
method: request.method().clone(),
path: request.path().to_string(),
headers: request.headers.clone(),
query: request.query.clone(),
meta: RequestMeta::from_request(request),
}
}
}
tokio::task_local! {
static REQUEST_HOOK_CONTEXT: RequestHookContext;
}
pub async fn with_request_hook_context<T>(
request: &AuthRequest,
future: impl std::future::Future<Output = T>,
) -> T {
with_request_hook_context_value(RequestHookContext::from_request(request), future).await
}
pub async fn with_request_hook_context_value<T>(
request_context: RequestHookContext,
future: impl std::future::Future<Output = T>,
) -> T {
REQUEST_HOOK_CONTEXT.scope(request_context, future).await
}
pub fn current_request_hook_context() -> Option<RequestHookContext> {
REQUEST_HOOK_CONTEXT.try_with(Clone::clone).ok()
}