use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
pub struct RateLimitingConfig {
#[serde(default = "default_enabled")]
pub enabled: bool,
pub default: String,
#[serde(default = "default_backend")]
pub backend: String,
pub redis_url_env: Option<String>,
#[serde(default)]
pub rules: Vec<RateLimitRule>,
#[serde(default)]
pub backpressure: BackpressureConfig,
}
fn default_enabled() -> bool {
true
}
fn default_backend() -> String {
"memory".to_string()
}
#[derive(Debug, Clone, Deserialize)]
pub struct RateLimitRule {
pub path: Option<String>,
pub mutation: Option<String>,
pub query: Option<String>,
pub limit: String,
#[serde(default = "default_key_by")]
pub by: String,
#[serde(default)]
pub burst: Option<u32>,
}
fn default_key_by() -> String {
"ip".to_string()
}
#[derive(Debug, Clone, Deserialize)]
pub struct BackpressureConfig {
#[serde(default)]
pub queue_enabled: bool,
#[serde(default = "default_queue_size")]
pub max_queue_size: usize,
#[serde(default = "default_queue_timeout")]
pub queue_timeout: String,
#[serde(default = "default_load_shed")]
pub load_shed: bool,
}
impl Default for BackpressureConfig {
fn default() -> Self {
Self {
queue_enabled: false,
max_queue_size: default_queue_size(),
queue_timeout: default_queue_timeout(),
load_shed: default_load_shed(),
}
}
}
fn default_queue_size() -> usize {
100
}
fn default_queue_timeout() -> String {
"5s".to_string()
}
fn default_load_shed() -> bool {
true
}