1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
#![deny(warnings)]
use hyper::server::Server;
use listenfd::ListenFd;
use std::convert::Infallible;
use warp::Filter;
extern crate listenfd;
/// You'll need to install `systemfd` and `cargo-watch`:
/// ```
/// cargo install systemfd cargo-watch
/// ```
/// And run with:
/// ```
/// systemfd --no-pid -s http::3030 -- cargo watch -x 'run --example autoreload'
/// ```
#[tokio::main]
async fn main() {
// Match any request and return hello world!
let routes = warp::any().map(|| "Hello, World!");
// hyper let's us build a server from a TcpListener (which will be
// useful shortly). Thus, we'll need to convert our `warp::Filter` into
// a `hyper::service::MakeService` for use with a `hyper::server::Server`.
let svc = warp::service(routes);
let make_svc = hyper::service::make_service_fn(|_: _| {
// the clone is there because not all warp filters impl Copy
let svc = svc.clone();
async move { Ok::<_, Infallible>(svc) }
});
let mut listenfd = ListenFd::from_env();
// if listenfd doesn't take a TcpListener (i.e. we're not running via
// the command above), we fall back to explicitly binding to a given
// host:port.
let server = if let Some(l) = listenfd.take_tcp_listener(0).unwrap() {
Server::from_tcp(l).unwrap()
} else {
Server::bind(&([127, 0, 0, 1], 3030).into())
};
server.serve(make_svc).await.unwrap();
}