1#![doc = include_str!("example.rs")]
9use std::future::Future;
11
12use async_trait::async_trait;
13use http::Extensions;
14use reqwest::{Request, Response};
15use reqwest_middleware::{Next, Result};
16
17pub trait RateLimiter: Send + Sync + 'static {
19 fn acquire_permit(&self) -> impl Future<Output = ()> + Send + '_;
21}
22
23pub fn all<R>(rate_limiter: R) -> Middleware<R> {
25 Middleware { rate_limiter }
26}
27
28pub struct Middleware<R> {
30 rate_limiter: R,
31}
32
33#[async_trait]
34impl<R: RateLimiter> reqwest_middleware::Middleware for Middleware<R> {
35 async fn handle(
36 &self,
37 req: Request,
38 extensions: &'_ mut Extensions,
39 next: Next<'_>,
40 ) -> Result<Response> {
41 self.rate_limiter.acquire_permit().await;
42 next.run(req, extensions).await
43 }
44}