use std::sync::Arc; use tokio::sync::broadcast; use crate::{ client::ClientManager, config::AppConfig, database::DbPool, logging::RequestLogger, models::registry::ModelRegistry, providers::ProviderManager, rate_limiting::RateLimitManager, }; /// Shared application state #[derive(Clone)] pub struct AppState { pub config: Arc, pub provider_manager: ProviderManager, pub db_pool: DbPool, pub rate_limit_manager: Arc, pub client_manager: Arc, pub request_logger: Arc, pub model_registry: Arc, pub dashboard_tx: broadcast::Sender, pub auth_tokens: Vec, } impl AppState { pub fn new( config: Arc, provider_manager: ProviderManager, db_pool: DbPool, rate_limit_manager: RateLimitManager, model_registry: ModelRegistry, auth_tokens: Vec, ) -> Self { let client_manager = Arc::new(ClientManager::new(db_pool.clone())); let (dashboard_tx, _) = broadcast::channel(100); let request_logger = Arc::new(RequestLogger::new(db_pool.clone(), dashboard_tx.clone())); Self { config, provider_manager, db_pool, rate_limit_manager: Arc::new(rate_limit_manager), client_manager, request_logger, model_registry: Arc::new(model_registry), dashboard_tx, auth_tokens, } } }