42 lines
1.4 KiB
Rust
42 lines
1.4 KiB
Rust
#![deny(warnings)]
|
|
use hyper::server::Server;
|
|
use listenfd::ListenFd;
|
|
use std::convert::Infallible;
|
|
use warp::Filter;
|
|
|
|
/// 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();
|
|
}
|