use std::num::NonZeroU32;
use std::sync::Arc;
use governor::state::keyed::DefaultKeyedStateStore;
use governor::{DefaultDirectRateLimiter, Quota, RateLimiter};
pub type ServiceRateLimiter =
RateLimiter<String, DefaultKeyedStateStore<String>, governor::clock::DefaultClock>;
pub fn build_limiter(per_second: u32) -> Arc<ServiceRateLimiter> {
let n = NonZeroU32::new(per_second.max(1)).unwrap_or(NonZeroU32::MIN);
let quota = Quota::per_second(n);
Arc::new(ServiceRateLimiter::keyed(quota))
}
pub async fn acquire(limiter: &Arc<ServiceRateLimiter>, key: &str) {
limiter.until_key_ready(&key.to_string()).await;
}