Function warp::service

source · [−]
pub fn service<F>(filter: F) -> FilteredService<F> where
    F: Filter,
    <F::Future as TryFuture>::Ok: Reply,
    <F::Future as TryFuture>::Error: IsReject, 
Expand description

Convert a Filter into a Service.

Filters are normally what APIs are built on in warp. However, it can be useful to convert a Filter into a Service, such as if further customizing a hyper::Service, or if wanting to make use of the greater Tower set of middleware.

Example

Running a warp::Filter on a regular hyper::Server:

use std::convert::Infallible;
use warp::Filter;

// Our Filter...
let route = warp::any().map(|| "Hello From Warp!");

// Convert it into a `Service`...
let svc = warp::service(route);

// Typical hyper setup...
let make_svc = hyper::service::make_service_fn(move |_| async move {
    Ok::<_, Infallible>(svc)
});

hyper::Server::bind(&([127, 0, 0, 1], 3030).into())
    .serve(make_svc)
    .await?;
Examples found in repository?
examples/autoreload.rs (line 24)
↕
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
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();
}