use hyper::service::{make_service_fn, service_fn}; use hyper::{Body, Request, Response, Server}; use std::convert::Infallible; use std::net::SocketAddr; #[tokio::main] async fn main() { // We'll bind to 127.0.0.1:3000 let addr = SocketAddr::from(([127, 0, 0, 1], 3000)); // A `Service` is needed for every connection, so this // creates one from our `hello_world` function. let make_svc = make_service_fn(|_conn| async { // service_fn converts our function into a `Service` Ok::<_, Infallible>(service_fn(hello_world)) }); // And construct the `Server` like normal... let server = Server::bind(&addr).serve(make_svc); // And now add a graceful shutdown signal... let graceful = server.with_graceful_shutdown(shutdown_signal()); // Run this server for... forever! if let Err(e) = graceful.await { eprintln!("server error: {}", e); } } async fn hello_world(_req: Request) -> Result, Infallible> { Ok(Response::new("Hello, World".into())) } async fn shutdown_signal() { // Wait for the CTRL+C signal tokio::signal::ctrl_c() .await .expect("failed to install CTRL+C signal handler"); }