redis_cell_rs/
policy.rs

1use std::time::Duration;
2
3#[derive(Clone, Copy, Debug)]
4#[non_exhaustive]
5pub struct Policy {
6    pub burst: usize,
7
8    pub tokens: usize,
9
10    pub period: Duration,
11
12    pub apply: usize,
13
14    pub name: Option<&'static str>,
15}
16
17impl Policy {
18    pub const fn new(burst: usize, tokens: usize, period: Duration, apply: usize) -> Policy {
19        Self {
20            burst,
21            tokens,
22            period,
23            apply,
24            name: None,
25        }
26    }
27
28    pub const fn from_tokens_per_second(tokens: usize) -> Policy {
29        Policy::from_tokens_per_period(tokens, Duration::from_secs(1))
30    }
31
32    pub const fn from_tokens_per_minute(tokens: usize) -> Policy {
33        Policy::from_tokens_per_period(tokens, Duration::from_secs(60))
34    }
35
36    pub const fn from_tokens_per_hour(tokens: usize) -> Policy {
37        Policy::from_tokens_per_period(tokens, Duration::from_secs(60 * 60))
38    }
39
40    pub const fn from_tokens_per_day(tokens: usize) -> Policy {
41        Policy::from_tokens_per_period(tokens, Duration::from_secs(60 * 60 * 24))
42    }
43
44    pub const fn from_tokens_per_period(tokens: usize, period: Duration) -> Policy {
45        Policy::new(0, tokens, period, 1)
46    }
47
48    pub const fn max_burst(mut self, burst: usize) -> Policy {
49        self.burst = burst;
50        self
51    }
52
53    pub const fn apply_tokens(mut self, apply: usize) -> Policy {
54        self.apply = apply;
55        self
56    }
57
58    pub const fn name(mut self, name: &'static str) -> Policy {
59        self.name = Some(name);
60        self
61    }
62}