use serde::{Deserialize, Serialize};
use std::env;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RateLimitConfig {
#[serde(default = "default_rate_limit_enabled")]
pub enabled: bool,
#[serde(default = "default_auth_rps")]
pub auth_rps: u64,
#[serde(default = "default_auth_burst")]
pub auth_burst: u32,
#[serde(default = "default_upload_rps")]
pub upload_rps: u64,
#[serde(default = "default_upload_burst")]
pub upload_burst: u32,
#[serde(default = "default_general_rps")]
pub general_rps: u64,
#[serde(default = "default_general_burst")]
pub general_burst: u32,
}
fn default_rate_limit_enabled() -> bool {
true
}
fn default_auth_rps() -> u64 {
1
}
fn default_auth_burst() -> u32 {
5
}
fn default_upload_rps() -> u64 {
200
}
fn default_upload_burst() -> u32 {
500
}
fn default_general_rps() -> u64 {
100
}
fn default_general_burst() -> u32 {
200
}
impl Default for RateLimitConfig {
fn default() -> Self {
Self {
enabled: default_rate_limit_enabled(),
auth_rps: default_auth_rps(),
auth_burst: default_auth_burst(),
upload_rps: default_upload_rps(),
upload_burst: default_upload_burst(),
general_rps: default_general_rps(),
general_burst: default_general_burst(),
}
}
}
impl RateLimitConfig {
pub(super) fn apply_env_overrides(&mut self) {
if let Ok(val) = env::var("NORA_RATE_LIMIT_ENABLED") {
self.enabled = val.to_lowercase() == "true" || val == "1";
}
if let Ok(val) = env::var("NORA_RATE_LIMIT_AUTH_RPS") {
super::parse_env_warn("NORA_RATE_LIMIT_AUTH_RPS", &val, &mut self.auth_rps);
}
if let Ok(val) = env::var("NORA_RATE_LIMIT_AUTH_BURST") {
super::parse_env_warn("NORA_RATE_LIMIT_AUTH_BURST", &val, &mut self.auth_burst);
}
if let Ok(val) = env::var("NORA_RATE_LIMIT_UPLOAD_RPS") {
super::parse_env_warn("NORA_RATE_LIMIT_UPLOAD_RPS", &val, &mut self.upload_rps);
}
if let Ok(val) = env::var("NORA_RATE_LIMIT_UPLOAD_BURST") {
super::parse_env_warn("NORA_RATE_LIMIT_UPLOAD_BURST", &val, &mut self.upload_burst);
}
if let Ok(val) = env::var("NORA_RATE_LIMIT_GENERAL_RPS") {
super::parse_env_warn("NORA_RATE_LIMIT_GENERAL_RPS", &val, &mut self.general_rps);
}
if let Ok(val) = env::var("NORA_RATE_LIMIT_GENERAL_BURST") {
super::parse_env_warn(
"NORA_RATE_LIMIT_GENERAL_BURST",
&val,
&mut self.general_burst,
);
}
}
}