use std::sync::Arc;
use tower::Layer;
use super::builder::RateLimitConfig;
use super::charge::DefaultResponseFactory;
use super::key_extractor::KeyExtractor;
use super::service::RateLimitService;
#[derive(Clone)]
#[must_use]
pub struct RateLimitLayer<K, S = (), P = u64, F = DefaultResponseFactory> {
pub(crate) key_extractor: K,
pub(crate) store: S,
pub(crate) limit_provider: P,
pub(crate) response_factory: F,
pub(crate) config: Arc<RateLimitConfig>,
}
impl<K, S, P, F, Inner> Layer<Inner> for RateLimitLayer<K, S, P, F>
where
K: KeyExtractor,
S: Clone,
P: Clone,
F: Clone,
{
type Service = RateLimitService<Inner, K, S, P, F>;
fn layer(&self, inner: Inner) -> Self::Service {
RateLimitService {
inner,
key_extractor: self.key_extractor.clone(),
store: self.store.clone(),
limit_provider: self.limit_provider.clone(),
response_factory: self.response_factory.clone(),
config: Arc::clone(&self.config),
}
}
}