use std::{error::Error, sync::Arc}; use axum::Router; use sqlx::PgPool; use tokio::{net::TcpListener, sync::RwLock}; use crate::config::MnemoConf; mod api; mod config; mod database; mod error; mod logs; mod persons; mod quotes; mod tags; mod users; mod web; /// The string to be returned alongside HTTP 500 const ISE_MSG: &str = "Internal server error"; #[derive(Debug, Clone)] pub struct MnemoState { pool: PgPool, conf: Arc>, } #[tokio::main] async fn main() -> Result<(), Box> { config::dotenv()?; config::env_logger()?; let pool = config::init_pool().await?; sqlx::migrate!("src/database/migrations").run(&pool).await?; log::info!("Migrations applied successfully."); let conf = Arc::new(RwLock::new( MnemoConf::load(&mut *pool.acquire().await?).await?, )); users::auth::init_password_dummies(); users::setup::initialise_reserved_users_if_needed(&pool).await?; let port = config::port()?; let r = Router::new() .merge(api::api_router()) .merge(web::web_router()) .with_state(MnemoState { pool, conf }); let l = TcpListener::bind(format!("0.0.0.0:{port}")).await?; log::info!("Listener bound to {}", l.local_addr()?); axum::serve(l, r).await?; Ok(()) }