Skip to main content

tower_rate_limiter/limiter/
layer.rs

1//! Tower layer implementation.
2
3use std::sync::Arc;
4
5use tower_layer::Layer;
6
7use super::{
8    builder::RateLimitConfig, key_extractor::KeyExtractor, response::DefaultResponseFactory, service::RateLimit,
9    store::Store,
10};
11
12/// Layer that applies [`RateLimit`].
13#[derive(Clone, Debug)]
14#[must_use]
15pub struct RateLimitLayer<K, S = (), P = u64, F = DefaultResponseFactory> {
16    pub(crate) key_extractor: K,
17    pub(crate) store: S,
18    pub(crate) limit_provider: P,
19    pub(crate) response_factory: F,
20    pub(crate) config: Arc<RateLimitConfig>,
21}
22
23impl<K, S, P, F, Inner> Layer<Inner> for RateLimitLayer<K, S, P, F>
24where
25    K: KeyExtractor,
26    S: Store,
27    P: Clone,
28    F: Clone,
29{
30    type Service = RateLimit<Inner, K, S, P, F>;
31
32    fn layer(&self, inner: Inner) -> Self::Service {
33        RateLimit {
34            inner,
35            key_extractor: self.key_extractor.clone(),
36            store: self.store.clone(),
37            limit_provider: self.limit_provider.clone(),
38            response_factory: self.response_factory.clone(),
39            config: Arc::clone(&self.config),
40        }
41    }
42}