//! HTTP Server use anyhow::Result; use axum::Router; use axum::serve::ListenerExt; use std::net::SocketAddr; use tower_http::services::ServeDir; pub async fn serve(place_routes: Router) -> Result<()> { let port = std::env::var("PORT").unwrap_or_default(); let port = str::parse(&port).unwrap_or(3000); let address = SocketAddr::from(([0, 0, 0, 0], port)); let routes = Router::new() .nest("/places", place_routes) .fallback_service(ServeDir::new("static")); tracing::debug!("listening on {}", address); let listener = tokio::net::TcpListener::bind(address) .await? .tap_io(|tcp_stream| { if let Err(err) = tcp_stream.set_nodelay(true) { tracing::trace!("failed to set TCP_NODELAY on incoming connection: {err:#}"); } }); axum::serve(listener, routes.into_make_service()) .with_graceful_shutdown(shutdown_signal()) .await?; Ok(()) } async fn shutdown_signal() { tokio::signal::ctrl_c() .await .expect("failed to listen for ctrl-c"); tracing::debug!("Received shutdown signal"); }