#![cfg_attr(docsrs, feature(doc_cfg))]
mod early_hints;
#[cfg(feature = "h1")]
mod h1;
#[cfg(feature = "h2")]
mod h2;
#[cfg(feature = "h3")]
mod h3;
mod incoming;
mod upgrade;
pub use early_hints::*;
#[cfg(feature = "h1")]
pub use h1::*;
#[cfg(feature = "h2")]
pub use h2::*;
#[cfg(feature = "h3")]
pub use h3::*;
pub use incoming::*;
pub use upgrade::*;
use http::{Request, Response};
use http_body::Body;
pub trait HttpProtocol: Sized {
fn handle<F, Fut, ResB, ResBE, ResE>(
self,
request_fn: F,
) -> impl std::future::Future<Output = Result<(), std::io::Error>>
where
F: Fn(Request<Incoming>) -> Fut + 'static,
Fut: std::future::Future<Output = Result<Response<ResB>, ResE>> + 'static,
ResB: Body<Data = bytes::Bytes, Error = ResBE> + Unpin + 'static,
ResE: std::error::Error,
ResBE: std::error::Error;
#[allow(unused_variables)]
#[inline]
fn handle_with_error_fn<F, Fut, ResB, ResBE, ResE, EF, EFut, EResB, EResBE, EResE>(
self,
request_fn: F,
error_fn: EF,
) -> impl std::future::Future<Output = Result<(), std::io::Error>>
where
F: Fn(Request<Incoming>) -> Fut + 'static,
Fut: std::future::Future<Output = Result<Response<ResB>, ResE>> + 'static,
ResB: Body<Data = bytes::Bytes, Error = ResBE> + Unpin + 'static,
ResE: std::error::Error,
ResBE: std::error::Error,
EF: FnOnce(bool) -> EFut,
EFut: std::future::Future<Output = Result<Response<EResB>, EResE>>,
EResB: Body<Data = bytes::Bytes, Error = EResBE> + Unpin + 'static,
EResE: std::error::Error,
EResBE: std::error::Error,
{
self.handle(request_fn)
}
}