ayun-server 0.23.0

The RUST Framework for Web Rustceans.
Documentation
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> {
        // dbg!(request.extensions().get::<Self>());
        Some(tower_http::request_id::RequestId::new(
            uuid::Uuid::now_v7()
                .to_string()
                .parse()
                .unwrap_or_else(|err| panic!("[middleware] `RequestId` applied error: {err}")),
        ))
    }
}