Skip to main content

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>, route: impl Into<String>) -> Selfb {
26        let now = Instant::now();
27        let ip = ip.into();
28        let route = route.into();
29        let b = format!("{}:{}", ip, route);
30
31        let (count, b) = self.requests.entry(b).or_insert((0, now));
32        let current_time = now.duration_since(*b).as_secs();
33        // println!("{:?} {:?}", self.duration, current_time);
34        // println!("{} {}", self.maximum_request, *count);
35        if current_time > self.duration.as_secs() {
36            *count = 0;
37            *b = now;
38        }
39        if self.maximum_request > *count {
40            *count += 1;
41            Selfb {
42                is_allowed: true,
43                remaning_count: (self.maximum_request - *count) as u64,
44                route: route,
45            }
46        } else {
47            Selfb {
48                is_allowed: false,
49                remaning_count: (self.maximum_request - *count) as u64,
50                route: route,
51            }
52        }
53    }
54}