mod user; use axum::Router; use tokio::net::TcpListener; use tracing::info; use crate::{ db::DbPool, models::{AppError, Environment}, }; #[derive(Clone)] pub struct AppState { pool: DbPool, env: Environment, } impl AppState { pub fn new(pool: DbPool, env: Environment) -> Self { Self { pool, env } } pub fn pool(&self) -> &DbPool { &self.pool } pub fn env(&self) -> &Environment { &self.env } } pub async fn start_app(pool: DbPool, env: Environment) -> Result<(), AppError> { let address = env.hostname(); let port = env.port(); info!("Listening on {address}:{port}..."); let listener = TcpListener::bind(format!("{address}:{port}")) .await .unwrap(); let app_state = AppState::new(pool, env); let app = Router::new().merge(user::requests(app_state.clone())); info!("API started successfully."); axum::serve(listener, app) .await .map_err(AppError::app_startup)?; Ok(()) }