use http::{HeaderName, HeaderValue, Request};
use tower::layer::util::{Identity, Stack};
use tower_http::request_id::{
MakeRequestId, PropagateRequestIdLayer, RequestId, SetRequestIdLayer,
};
static X_REQUEST_ID: HeaderName = HeaderName::from_static("x-request-id");
#[derive(Clone)]
pub struct ModoRequestId;
impl MakeRequestId for ModoRequestId {
fn make_request_id<B>(&mut self, _request: &Request<B>) -> Option<RequestId> {
let id = crate::id::ulid();
Some(RequestId::new(HeaderValue::from_str(&id).unwrap()))
}
}
pub fn request_id() -> tower::ServiceBuilder<
Stack<PropagateRequestIdLayer, Stack<SetRequestIdLayer<ModoRequestId>, Identity>>,
> {
tower::ServiceBuilder::new()
.layer(SetRequestIdLayer::new(X_REQUEST_ID.clone(), ModoRequestId))
.layer(PropagateRequestIdLayer::new(X_REQUEST_ID.clone()))
}