macro_rules! create_middleware {
    ($name: ident, $code: expr) => { ... };
}
Expand description

Macro to to reduce boilerplate codes for simple actix_web middleware.

§Example

use actix_middleware_macro::create_middleware;

create_middleware!(
    TimingHeaders,
    |ctx: &MiddlewareTransform<S>, req: ServiceRequest| {
        use actix_web::http::header::{HeaderName, HeaderValue};
        use chrono::Utc;
     
        let start = Utc::now();
     
        let fut = ctx.service.call(req);
        Box::pin(async move {
            let mut res = fut.await?;
            let duration = Utc::now() - start;
            res.headers_mut().insert(
                HeaderName::from_static("x-app-time-ms"),
                HeaderValue::from_str(&format!("{}", duration.num_milliseconds()))?,
            );
            Ok(res)
        })
    }
);

// Usage
#[actix_web::test]
async fn works() {
    let _server = tokio::spawn(async {
        actix_web::HttpServer::new(|| {
            actix_web::App::new()
                .default_service(web::to(|| async { actix_web::HttpResponse::Ok() }))
                .wrap(timing_cors_headers_middleware::Middleware)
        })
        .bind("127.1:8080")
        .unwrap()
        .run()
        .await
        .unwrap();
    });
    tokio::time::sleep(tokio::time::Duration::from_secs(1)).await;
    let response = ureq::get("http://127.1:8080").call().unwrap();
    assert!(response.header("x-app-time-ms").is_some());
}