Skip to main content

alux_http_hyper/
server.rs

1use crate::{DRAIN, HyperConnections, HyperRoute};
2use alux_http::{HttpServerAlg, HttpServerSetup};
3use tokio::net::TcpListener;
4
5type HyperServerError = Box<dyn std::error::Error + Send + Sync>;
6
7/// Serves a direct HTTP surface over hyper at the address its setup names.
8#[derive(Debug, Default)]
9pub struct HyperServer;
10
11impl HttpServerAlg for HyperServer {
12    type Program = HyperRoute;
13    type Open = HyperConnections;
14    type Error = HyperServerError;
15
16    async fn open(&mut self, setup: HttpServerSetup<Self::Program>) -> Result<Self::Open, Self::Error> {
17        let (bind, route) = setup.into_parts();
18        let listener = TcpListener::bind(bind.address()).await?;
19
20        Ok(HyperConnections::serve(listener, route, DRAIN))
21    }
22
23    async fn close(&mut self, open: &mut Self::Open) -> Result<(), Self::Error> {
24        open.close().await;
25
26        Ok(())
27    }
28
29    async fn end(&mut self, open: &mut Self::Open) -> Result<(), Self::Error> {
30        open.end().await;
31
32        Ok(())
33    }
34}