use std::net::SocketAddr; use tracing_subscriber::EnvFilter; #[tokio::main] async fn main() -> anyhow::Result<()> { dotenvy::dotenv().ok(); tracing_subscriber::fmt() .with_env_filter( EnvFilter::try_from_default_env().unwrap_or_else(|_| "info,mangalord=debug".into()), ) .init(); let config = mangalord::config::Config::from_env()?; let addr: SocketAddr = config.bind_address.parse()?; let mangalord::app::AppHandle { router, daemon } = mangalord::app::build(config).await?; tracing::info!(%addr, "mangalord listening"); let listener = tokio::net::TcpListener::bind(addr).await?; axum::serve(listener, router) .with_graceful_shutdown(async { let _ = tokio::signal::ctrl_c().await; tracing::info!("ctrl-c received; shutting down"); }) .await?; // Drain background tasks (crawler daemon) before exiting so Chromium // gets a clean shutdown rather than relying on kill-on-drop. if let Some(d) = daemon { d.shutdown().await; } Ok(()) }