#![doc = include_str!("example.rs")]
use std::future::Future;
use async_trait::async_trait;
use http::Extensions;
use reqwest::{Request, Response};
use reqwest_middleware::{Next, Result};
pub trait RateLimiter: Send + Sync + 'static {
fn acquire_permit(&self) -> impl Future<Output = ()> + Send + '_;
}
pub fn all<R>(rate_limiter: R) -> Middleware<R> {
Middleware { rate_limiter }
}
pub struct Middleware<R> {
rate_limiter: R,
}
#[async_trait]
impl<R: RateLimiter> reqwest_middleware::Middleware for Middleware<R> {
async fn handle(
&self,
req: Request,
extensions: &'_ mut Extensions,
next: Next<'_>,
) -> Result<Response> {
self.rate_limiter.acquire_permit().await;
next.run(req, extensions).await
}
}