diff options
Diffstat (limited to 'vendor/hyper/src/rt/bounds.rs')
| -rw-r--r-- | vendor/hyper/src/rt/bounds.rs | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/vendor/hyper/src/rt/bounds.rs b/vendor/hyper/src/rt/bounds.rs new file mode 100644 index 00000000..aa3075e0 --- /dev/null +++ b/vendor/hyper/src/rt/bounds.rs @@ -0,0 +1,109 @@ +//! Trait aliases +//! +//! Traits in this module ease setting bounds and usually automatically +//! implemented by implementing another trait. + +#[cfg(all(feature = "server", feature = "http2"))] +pub use self::h2::Http2ServerConnExec; + +#[cfg(all(feature = "client", feature = "http2"))] +pub use self::h2_client::Http2ClientConnExec; + +#[cfg(all(feature = "client", feature = "http2"))] +#[cfg_attr(docsrs, doc(cfg(all(feature = "client", feature = "http2"))))] +mod h2_client { + use std::{error::Error, future::Future}; + + use crate::rt::{Read, Write}; + use crate::{proto::h2::client::H2ClientFuture, rt::Executor}; + + /// An executor to spawn http2 futures for the client. + /// + /// This trait is implemented for any type that implements [`Executor`] + /// trait for any future. + /// + /// This trait is sealed and cannot be implemented for types outside this crate. + /// + /// [`Executor`]: crate::rt::Executor + pub trait Http2ClientConnExec<B, T>: sealed_client::Sealed<(B, T)> + where + B: http_body::Body, + B::Error: Into<Box<dyn Error + Send + Sync>>, + T: Read + Write + Unpin, + { + #[doc(hidden)] + fn execute_h2_future(&mut self, future: H2ClientFuture<B, T>); + } + + impl<E, B, T> Http2ClientConnExec<B, T> for E + where + E: Executor<H2ClientFuture<B, T>>, + B: http_body::Body + 'static, + B::Error: Into<Box<dyn Error + Send + Sync>>, + H2ClientFuture<B, T>: Future<Output = ()>, + T: Read + Write + Unpin, + { + fn execute_h2_future(&mut self, future: H2ClientFuture<B, T>) { + self.execute(future) + } + } + + impl<E, B, T> sealed_client::Sealed<(B, T)> for E + where + E: Executor<H2ClientFuture<B, T>>, + B: http_body::Body + 'static, + B::Error: Into<Box<dyn Error + Send + Sync>>, + H2ClientFuture<B, T>: Future<Output = ()>, + T: Read + Write + Unpin, + { + } + + mod sealed_client { + pub trait Sealed<X> {} + } +} + +#[cfg(all(feature = "server", feature = "http2"))] +#[cfg_attr(docsrs, doc(cfg(all(feature = "server", feature = "http2"))))] +mod h2 { + use crate::{proto::h2::server::H2Stream, rt::Executor}; + use http_body::Body; + use std::future::Future; + + /// An executor to spawn http2 connections. + /// + /// This trait is implemented for any type that implements [`Executor`] + /// trait for any future. + /// + /// This trait is sealed and cannot be implemented for types outside this crate. + /// + /// [`Executor`]: crate::rt::Executor + pub trait Http2ServerConnExec<F, B: Body>: sealed::Sealed<(F, B)> + Clone { + #[doc(hidden)] + fn execute_h2stream(&mut self, fut: H2Stream<F, B>); + } + + #[doc(hidden)] + impl<E, F, B> Http2ServerConnExec<F, B> for E + where + E: Executor<H2Stream<F, B>> + Clone, + H2Stream<F, B>: Future<Output = ()>, + B: Body, + { + fn execute_h2stream(&mut self, fut: H2Stream<F, B>) { + self.execute(fut) + } + } + + impl<E, F, B> sealed::Sealed<(F, B)> for E + where + E: Executor<H2Stream<F, B>> + Clone, + H2Stream<F, B>: Future<Output = ()>, + B: Body, + { + } + + mod sealed { + pub trait Sealed<T> {} + } +} |
