tower_rate_limiter/limiter/
layer.rs1use 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#[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}