Skip to main content

tower_rate_limiter/limiter/
limit.rs

1//! Fixed and request-derived quota-limit resolution.
2
3use std::future::{Future, Ready, ready};
4
5use http::Request;
6
7use super::error::RateLimitError;
8
9/// Resolve a fixed or request-derived quota limit asynchronously.
10///
11/// A [`super::RateLimitLayer`] clones its provider into each produced Service.
12pub trait LimitProvider: Clone {
13    /// The concrete future returned by [`LimitProvider::limit`].
14    type Future: Future<Output = Result<u64, RateLimitError>>;
15
16    /// Resolve the quota limit for one request.
17    fn limit<B>(&self, request: &Request<B>) -> Self::Future;
18}
19
20/// Treat a raw `u64` as the fixed provider used by the builder's `.limit(...)` method.
21impl LimitProvider for u64 {
22    type Future = Ready<Result<u64, RateLimitError>>;
23
24    fn limit<B>(&self, _request: &Request<B>) -> Self::Future {
25        ready(Ok(*self))
26    }
27}