use std::{convert::Infallible, error::Error as StdError, io};
use hyper::body::Body as HttpBody;
use tokio::net::TcpListener;
use zon_core::{HttpService, IntoHttpService};
use crate::ZonToHyperService;
pub async fn serve<B: Send, X>(
tcp_listener: TcpListener,
svc: impl IntoHttpService<
B,
X,
Service: HttpService<
hyper::body::Incoming,
ResponseBody: HttpBody<Data: Send, Error: Into<Box<dyn StdError + Send + Sync>>> + Send,
> + Clone
+ Send
+ 'static,
>,
) -> Result<Infallible, io::Error> {
let svc = ZonToHyperService::new(svc.into_svc());
loop {
let (socket, _remote_addr) = tcp_listener.accept().await?;
let svc = svc.clone();
tokio::spawn(async move {
let socket = hyper_util::rt::TokioIo::new(socket);
if let Err(err) =
hyper_util::server::conn::auto::Builder::new(hyper_util::rt::TokioExecutor::new())
.serve_connection(socket, svc)
.await
{
eprintln!("Failed to serve connection: {err:#}");
}
});
}
}