mod user; use std::sync::Arc; use axum::Router; use tokio::net::TcpListener; use webauthn_rs::Webauthn; use crate::{db::DbPool, error::AppError, models::Environment}; #[derive(Clone)] pub struct AppState { pool: DbPool, env: Environment, webauthn: Arc, } impl AppState { pub fn new(pool: DbPool, env: Environment) -> Self { let rp_id = 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(); 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())); axum::serve(listener, app) .await .map_err(AppError::app_startup)?; println!("Application started successfully."); Ok(()) }