pub trait RateLimitProvider: Send + Sync + 'static {
fn apply(&self, router: axum::Router) -> axum::Router;
}
#[cfg(feature = "ratelimit-memory")]
mod memory_impl {
use super::RateLimitProvider;
use crate::adapters::security::rate_limit::{
RateLimitBackend, RateLimitExtractor, RateLimitLayer,
};
impl RateLimitProvider for RateLimitBackend {
fn apply(&self, router: axum::Router) -> axum::Router {
router.layer(RateLimitLayer::new_memory(
self.limit,
self.window_secs,
RateLimitExtractor::default(),
))
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use axum::Router;
struct PassthroughProvider;
impl RateLimitProvider for PassthroughProvider {
fn apply(&self, router: Router) -> Router {
router
}
}
#[test]
fn provider_can_be_boxed_and_called() {
let provider: Box<dyn RateLimitProvider> = Box::new(PassthroughProvider);
let _ = provider.apply(Router::new());
}
#[cfg(feature = "ratelimit-memory")]
#[test]
fn rate_limit_backend_implements_provider() {
use crate::adapters::security::rate_limit::RateLimitBackend;
let backend = RateLimitBackend {
limit: 10,
window_secs: 60,
};
let provider: Box<dyn RateLimitProvider> = Box::new(backend);
let _ = provider.apply(Router::new());
}
}