use std::sync::Arc; use axum::Router; use tokio::{net::TcpListener, sync::Mutex}; use tracing::Level; use tracing_subscriber::FmtSubscriber; use wrbapp_server::routes::member::migrate::MigrationStore; use wrbapp_server::routes::routes; use wrbapp_server::{database, AppState}; #[tokio::main] async fn main() { dotenvy::dotenv().ok(); // Initialize logging let subscriber = FmtSubscriber::builder() .with_max_level(Level::INFO) .finish(); tracing::subscriber::set_global_default(subscriber) .expect("Error while initialized tracing subscriber"); // Initialize database connection database::apply_migrations() .await .expect("Database migrations failed"); let pool = database::connect() .await .expect("Database connection failed"); let migration_store = Arc::new(Mutex::new(MigrationStore::default())); let app_state = AppState { pool, migration_store, }; // Serve app let app = Router::new().merge(routes()).with_state(app_state); let listener = TcpListener::bind("127.0.0.1:3000") .await .expect("Error while initializing listener"); tracing::info!("Listening on {}", listener.local_addr().unwrap()); axum::serve(listener, app) .await .expect("Error while serving axum application"); }