gcra 0.6.0

A basic implementation of GCRA algorithm for rate limiting
Documentation
use std::sync::Arc;

use gcra::{GcraError, RateLimit, RateLimiter};

const CACHE_CAPACITY: usize = 4;
const WORKER_SHARD_COUNT: usize = 2;

#[tokio::main]
async fn main() -> Result<(), GcraError> {
    let rate_limit = RateLimit::per_sec(2);
    let rate_limiter = Arc::new(RateLimiter::with_shards(CACHE_CAPACITY, WORKER_SHARD_COUNT));

    rate_limiter.check("key", &rate_limit, 1).await?;
    rate_limiter.check("key", &rate_limit, 1).await?;

    match rate_limiter.check("key", &rate_limit, 1).await {
        Err(GcraError::DeniedUntil { next_allowed_at }) => {
            print!("Denied: Request next at {:?}", next_allowed_at);
            Ok(())
        }
        unexpected => panic!("Opps something went wrong! {:?}", unexpected),
    }
}