pub mod database; pub mod error; pub mod redis; pub mod storage; pub mod email; pub mod rest; use std::sync::Arc; use config::AppConfig; pub use database::{AppDatabase, DatabaseRole}; pub use email::{AppEmail, EmailClient}; pub use error::ExportError; pub use redis::{AppRedis, RedisConnection}; pub use storage::AppStorage; #[derive(Clone)] pub struct AppState { pub database: Arc, pub redis: AppRedis, pub storage: Arc, pub email: AppEmail, pub config: AppConfig, } impl AppState { pub async fn load() -> Result { let config = config::AppConfig::load() .map_err(|e| ExportError::InvalidConfig(e.to_string()))?; Self::with_config(config).await } pub async fn with_config(config: AppConfig) -> Result { config .validate() .map_err(|e| ExportError::InvalidConfig(e.to_string()))?; let database = Arc::new(AppDatabase::connect(config.database.clone()).await?); let redis = AppRedis::connect(config.redis.clone()).await?; let storage = Arc::new(AppStorage::connect(config.s3.clone())?); let email = AppEmail::connect(config.mailbaby.clone()).await?; Ok(Self { database, redis, storage, email, config, }) } }