use std::sync::Arc;
pub mod api;
pub mod auth;
pub mod config;
pub mod error;
pub mod logging;
pub mod mail;
pub mod policy;
pub mod rate_limit;
pub mod sanitize;
pub mod security;
pub mod smtp;
pub mod validation;
#[cfg(test)]
mod tests;
pub struct AppState {
config_store: arc_swap::ArcSwap<config::AppConfig>,
pub smtp: smtp::SmtpTransport,
pub rate_limiter: Arc<rate_limit::RateLimiter>,
}
impl AppState {
pub fn new(config: config::AppConfig) -> Arc<Self> {
let smtp = smtp::build_transport(&config.smtp)
.expect("SMTP transport construction failed after config validation");
let rate_limiter = Arc::new(rate_limit::RateLimiter::new(&config.rate_limit));
Arc::new(Self {
config_store: arc_swap::ArcSwap::from_pointee(config),
smtp,
rate_limiter,
})
}
pub fn config(&self) -> Arc<config::AppConfig> {
self.config_store.load_full()
}
pub fn reload_config(&self, new_config: config::AppConfig) {
self.config_store.store(Arc::new(new_config));
tracing::info!(event = "config_reloaded");
}
}