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>) -> 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 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}