use tokio::net::TcpListener; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; use unnamed_server::state::AppState; use crate::config::Config; mod config; #[tokio::main] #[tracing::instrument] async fn main() -> Result<(), unnamed_server::Error> { tracing_subscriber::registry() .with( tracing_subscriber::EnvFilter::try_from_default_env() .unwrap_or_else(|_| "unnamed_server=debug".into()), ) .with(tracing_subscriber::fmt::layer()) .init(); let _ = dotenvy::dotenv(); let config = Config::init(); let state = AppState::new(config.database_url).await?; let app = unnamed_server::router(state); let listener = TcpListener::bind("127.0.0.1:30000").await?; tracing::info!("Server listening on http://{}", listener.local_addr()?); axum::serve(listener, app) .with_graceful_shutdown(shutdown_signal()) .await .map_err(From::from) } async fn shutdown_signal() { let ctrl_c = async { tokio::signal::ctrl_c() .await .expect("failed to install Ctrl+C handler"); }; #[cfg(unix)] let terminate = async { tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate()) .expect("failed to install signal handler") .recv() .await; }; #[cfg(not(unix))] let terminate = std::future::pending::<()>(); tokio::select! { _ = ctrl_c => {}, _ = terminate => {}, } }