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}