rusty_rl/
fixed.rs

1use std::{
2    collections::HashMap,
3    time::{Duration, Instant},
4};
5
6use crate::{FixedLimit, Selfb};
7
8// / fixed limit
9// / ```
10// /     let mut b = FixedLimit::new().maximum_request(600, 1);
11// / ```
12impl FixedLimit {
13    pub fn new() -> Self {
14        FixedLimit {
15            maximum_request: 0,
16            duration: Duration::default(),
17            requests: HashMap::new(),
18        }
19    }
20    pub fn maximum_request(mut self, maximum_request: usize, duration: u64) -> Self {
21        self.maximum_request = maximum_request;
22        self.duration = Duration::from_secs(duration);
23        self
24    }
25    pub fn allow(&mut self, ip: impl Into<String>) -> Selfb {
26        let now = Instant::now();
27        let (count, b) = self.requests.entry(ip.into()).or_insert((0, now));
28        let current_time = now.duration_since(*b).as_secs();
29        // println!("{:?} {:?}", self.duration, current_time);
30        // println!("{} {}", self.maximum_request, *count);
31        if current_time > self.duration.as_secs() {
32            *count = 0;
33            *b = now;
34        }
35        if self.maximum_request > *count {
36            *count += 1;
37            Selfb {
38                is_allowed: true,
39                remaning_count: (self.maximum_request - *count) as u64,
40            }
41        } else {
42            Selfb {
43                is_allowed: false,
44                remaning_count: (self.maximum_request - *count) as u64,
45            }
46        }
47    }
48}