#![cfg(feature = "tokio-time")]
use rate_guard::{Millis, TokioTimeSource, RateLimit, RateLimitError};
use rate_guard::limits::ApproximateSlidingWindowBuilder;
use std::time::Duration;
#[tokio::main]
async fn main() {
let limiter = ApproximateSlidingWindowBuilder::builder()
.capacity(3)
.window_duration(Duration::from_secs(6))
.with_time(TokioTimeSource::new())
.with_precision::<Millis>()
.build()
.unwrap();
for i in 0..8 {
loop {
match limiter.try_acquire_verbose(1) {
Ok(()) => {
println!("Approximate async request {} allowed", i);
break;
}
Err(RateLimitError::InsufficientCapacity { retry_after, .. }) => {
println!("Approximate async request {} rate limited. Retrying after {:?}", i, retry_after);
tokio::time::sleep(retry_after).await;
}
Err(e) => {
eprintln!("Approximate async request {} failed: {}", i, e);
break;
}
}
}
}
println!("Remaining: {}", limiter.capacity_remaining().unwrap());
}