use std::{
collections::HashMap,
time::{Duration, Instant},
};
use crate::{FixedLimit, Selfb};
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();
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,
}
}
}
}