1use crate::{BlockingHandler, Service};
2
3use std::future::Future;
4use std::net::SocketAddr;
5use std::sync::Arc;
6
7use hyper::server::conn::AddrStream;
8use hyper::service;
9use service::make_service_fn;
10
11#[derive(Debug)]
13pub struct Server;
14
15impl Server {
16 pub fn serve<H: conduit::Handler>(addr: &SocketAddr, handler: H) -> impl Future {
23 let handler = Arc::new(BlockingHandler::new(handler));
24 let make_service = make_service_fn(move |socket: &AddrStream| {
25 let handler = handler.clone();
26 let remote_addr = socket.remote_addr();
27 async move { Service::from_blocking(handler, remote_addr) }
28 });
29
30 hyper::Server::bind(addr).serve(make_service)
31 }
32}