touch_ratelimit 0.1.0

A composable, extensible rate limiting crate for Rust
Documentation
use tower::Layer;

use crate::middleware::service::RateLimitService;

/// A Tower layer that applies rate limiting to a service.
///
/// This layer wraps an existing service and enforces rate limiting
/// before forwarding requests.
#[derive(Clone)]
pub struct RateLimitLayer<Store, Extractor> {
    store: Store,
    extractor: Extractor,
}

impl<Store, Extractor> RateLimitLayer<Store, Extractor> {
    /// Create a new rate limiting layer.
    pub fn new(store: Store, extractor: Extractor) -> Self {
        Self { store, extractor }
    }
}

impl<S, Store, Extractor> Layer<S> for RateLimitLayer<Store, Extractor>
where
    Store: Clone,
    Extractor: Clone,
{
    type Service = RateLimitService<S, Store, Extractor>;

    fn layer(&self, inner: S) -> Self::Service {
        RateLimitService {
            inner,
            store: self.store.clone(),
            extractor: self.extractor.clone(),
        }
    }
}