use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(default)]
pub struct RateLimitConfig {
pub enabled: bool,
pub requests_per_window: u32,
pub window_secs: u64,
pub key_by: RateLimitKey,
pub exclude_paths: Vec<String>,
pub path_limits: Vec<PathRateLimit>,
}
impl Default for RateLimitConfig {
fn default() -> Self {
Self {
enabled: false,
requests_per_window: 100,
window_secs: 60,
key_by: RateLimitKey::Ip,
exclude_paths: vec!["/health".to_string()],
path_limits: vec![],
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum RateLimitKey {
#[default]
Ip,
User,
ApiKey,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PathRateLimit {
pub path: String,
pub requests_per_window: u32,
}