blob: a21d9b1369c5d1ddb0354fb093988da0d77b90ac (
plain)
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
|
#![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();
}
|