rate-guard 0.1.0

Thread-safe rate limiting library with multiple algorithms and Duration-based configuration
Documentation
#![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());
}