use serde::{Deserialize, Serialize};
fn default_true() -> bool { true }
fn default_false() -> bool { false }
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FeaturesConfig {
#[serde(default = "default_true")]
pub user_registration: bool,
#[serde(default = "default_true")]
pub email_verification: bool,
#[serde(default = "default_true")]
pub password_reset: bool,
#[serde(default = "default_false")]
pub two_factor_auth: bool,
#[serde(default = "default_false")]
pub social_login: bool,
#[serde(default = "default_true")]
pub audit_logging: bool,
#[serde(default = "default_true")]
pub rate_limiting: bool,
#[serde(default)]
pub rate_limiting_config: Option<RateLimitingConfig>,
}
impl Default for FeaturesConfig {
fn default() -> Self {
Self {
user_registration: true,
email_verification: true,
password_reset: true,
two_factor_auth: false,
social_login: false,
audit_logging: true,
rate_limiting: true,
rate_limiting_config: Some(RateLimitingConfig::default()),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RateLimitingConfig {
#[serde(default = "default_rate_limit")]
pub default_limit: u32,
#[serde(default = "default_burst_limit")]
pub burst_limit: u32,
#[serde(default = "default_rate_storage")]
pub storage: String,
}
fn default_rate_limit() -> u32 { 1000 }
fn default_burst_limit() -> u32 { 100 }
fn default_rate_storage() -> String { "redis".to_string() }
impl Default for RateLimitingConfig {
fn default() -> Self {
Self {
default_limit: default_rate_limit(),
burst_limit: default_burst_limit(),
storage: default_rate_storage(),
}
}
}