1pub use tower_governor::{
9 governor::GovernorConfigBuilder, key_extractor::SmartIpKeyExtractor, GovernorLayer,
10};
11
12#[derive(Debug, Clone)]
14pub struct RateLimitConfig {
15 pub requests_per_period: u32,
17 pub period_secs: u64,
19 pub burst_size: u32,
21 pub enabled: bool,
23}
24
25impl Default for RateLimitConfig {
26 fn default() -> Self {
27 Self {
28 requests_per_period: 100,
29 period_secs: 60,
30 burst_size: 10,
31 enabled: true,
32 }
33 }
34}
35
36impl RateLimitConfig {
37 pub fn from_env() -> Self {
45 let enabled = std::env::var("RATE_LIMIT_ENABLED")
46 .ok()
47 .and_then(|v| v.parse().ok())
48 .unwrap_or(true);
49
50 let requests_per_period = std::env::var("RATE_LIMIT_REQUESTS")
51 .ok()
52 .and_then(|v| v.parse().ok())
53 .unwrap_or(100);
54
55 let period_secs = std::env::var("RATE_LIMIT_PERIOD_SECS")
56 .ok()
57 .and_then(|v| v.parse().ok())
58 .unwrap_or(60);
59
60 let burst_size = std::env::var("RATE_LIMIT_BURST")
61 .ok()
62 .and_then(|v| v.parse().ok())
63 .unwrap_or(10);
64
65 Self {
66 requests_per_period,
67 period_secs,
68 burst_size,
69 enabled,
70 }
71 }
72
73 pub fn validate(&self) -> Result<(), String> {
75 if self.requests_per_period == 0 {
76 return Err("requests_per_period must be greater than 0".to_string());
77 }
78
79 if self.period_secs == 0 {
80 return Err("period_secs must be greater than 0".to_string());
81 }
82
83 if self.burst_size == 0 {
84 return Err("burst_size must be greater than 0".to_string());
85 }
86
87 Ok(())
88 }
89}