rusty-rl 0.1.2

simple ratelimit
Documentation
use std::{
    collections::HashMap,
    time::{Duration, Instant},
};

use crate::{FixedLimit, Selfb};

// / fixed limit
// / ```
// /     let mut b = FixedLimit::new().maximum_request(600, 1);
// / ```
impl FixedLimit {
    pub fn new() -> Self {
        FixedLimit {
            maximum_request: 0,
            duration: Duration::default(),
            requests: HashMap::new(),
        }
    }
    pub fn maximum_request(mut self, maximum_request: usize, duration: u64) -> Self {
        self.maximum_request = maximum_request;
        self.duration = Duration::from_secs(duration);
        self
    }
    pub fn allow(&mut self, ip: impl Into<String>, route: impl Into<String>) -> Selfb {
        let now = Instant::now();
        let ip = ip.into();
        let route = route.into();
        let b = format!("{}:{}", ip, route);

        let (count, b) = self.requests.entry(b).or_insert((0, now));
        let current_time = now.duration_since(*b).as_secs();
        // println!("{:?} {:?}", self.duration, current_time);
        // println!("{} {}", self.maximum_request, *count);
        if current_time > self.duration.as_secs() {
            *count = 0;
            *b = now;
        }
        if self.maximum_request > *count {
            *count += 1;
            Selfb {
                is_allowed: true,
                remaning_count: (self.maximum_request - *count) as u64,
                route: route,
            }
        } else {
            Selfb {
                is_allowed: false,
                remaning_count: (self.maximum_request - *count) as u64,
                route: route,
            }
        }
    }
}