use axum::Router; use dotenvy::dotenv; use std::net::SocketAddr; mod api; mod core; mod db; mod errors; mod schemas; mod services; mod utils; use crate::core::config::Config; #[tokio::main] async fn main() -> anyhow::Result<()> { dotenv().ok(); tracing_subscriber::fmt::init(); let config = Config::from_env()?; // Initialize DB let db = db::connect(&config).await?; // Shared app state let state = std::sync::Arc::new(crate::api::deps::AppState { db: db.clone(), cfg: config.clone() }); // Build router with /api/v1 prefix and provide state via Extension let api_router = Router::new() .merge(api::routers::auth::router()) .merge(api::routers::users::router()); let app = Router::new().nest("/api/v1", api_router).layer(axum::Extension(state)); let addr = SocketAddr::from((config.server_host.parse::()?, config.server_port)); tracing::info!("Starting server on {}", addr); let listener = tokio::net::TcpListener::bind(&addr).await?; axum::serve(listener, app).await?; Ok(()) }