headless_lms_server/domain/
request_id.rs

1use actix_http::HttpMessage;
2use actix_web::FromRequest;
3
4use crate::prelude::*;
5use std::{
6    convert::Infallible,
7    future::{Ready, ready},
8};
9
10/// Extractor for a request's id.
11/// The id is generated on extraction if it does not exist.
12#[derive(Debug, Clone, Copy, Serialize)]
13#[cfg_attr(feature = "ts_rs", derive(TS))]
14pub struct RequestId(pub Uuid);
15
16impl FromRequest for RequestId {
17    type Error = Infallible;
18    type Future = Ready<Result<Self, Self::Error>>;
19
20    fn from_request(
21        req: &actix_web::HttpRequest,
22        _payload: &mut actix_http::Payload,
23    ) -> Self::Future {
24        let id = req.extensions().get::<Self>().copied().unwrap_or_else(|| {
25            let new_id = RequestId(Uuid::new_v4());
26            req.extensions_mut().insert(new_id);
27            new_id
28        });
29        ready(Ok(id))
30    }
31}