zon_hyper 0.0.3

part of a new WIP, very incomplete async http service stack
Documentation
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:#}");
            }
        });
    }
}