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}