use crate::{config::X_REQUEST_ID, traits::MiddlewareTrait, Middleware};
use axum::{extract::Request, http::HeaderName};
use tower::ServiceBuilder;
use tower_http::request_id::{MakeRequestId, PropagateRequestIdLayer, SetRequestIdLayer};
#[derive(Clone)]
pub struct RequestId;
impl MiddlewareTrait for RequestId {
fn handle() -> Middleware {
Box::new(|router| {
Ok(router.layer(
ServiceBuilder::new()
.layer(SetRequestIdLayer::new(
HeaderName::from_static(X_REQUEST_ID),
RequestId,
))
.layer(PropagateRequestIdLayer::new(HeaderName::from_static(
X_REQUEST_ID,
))),
))
})
}
}
impl MakeRequestId for RequestId {
fn make_request_id<B>(&mut self, _: &Request<B>) -> Option<tower_http::request_id::RequestId> {
Some(tower_http::request_id::RequestId::new(
uuid::Uuid::now_v7()
.to_string()
.parse()
.unwrap_or_else(|err| panic!("[middleware] `RequestId` applied error: {err}")),
))
}
}