1use std::{
2 collections::HashMap,
3 time::{Duration, Instant},
4};
5
6use crate::{FixedLimit, Selfb};
7
8impl 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 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}