#[allow(unused_macros)] macro_rules! define_inner_service_accessors { () => { /// Gets a reference to the underlying service. pub fn get_ref(&self) -> &S { &self.inner } /// Gets a mutable reference to the underlying service. pub fn get_mut(&mut self) -> &mut S { &mut self.inner } /// Consumes `self`, returning the underlying service. pub fn into_inner(self) -> S { self.inner } }; } #[allow(unused_macros)] macro_rules! opaque_body { ($(#[$m:meta])* pub type $name:ident = $actual:ty;) => { opaque_body! { $(#[$m])* pub type $name<> = $actual; } }; ($(#[$m:meta])* pub type $name:ident<$($param:ident),*> = $actual:ty;) => { pin_project_lite::pin_project! { $(#[$m])* pub struct $name<$($param),*> { #[pin] pub(crate) inner: $actual } } impl<$($param),*> $name<$($param),*> { pub(crate) fn new(inner: $actual) -> Self { Self { inner } } } impl<$($param),*> http_body::Body for $name<$($param),*> { type Data = <$actual as http_body::Body>::Data; type Error = <$actual as http_body::Body>::Error; #[inline] fn poll_frame( self: std::pin::Pin<&mut Self>, cx: &mut std::task::Context<'_>, ) -> std::task::Poll, Self::Error>>> { self.project().inner.poll_frame(cx) } #[inline] fn is_end_stream(&self) -> bool { http_body::Body::is_end_stream(&self.inner) } #[inline] fn size_hint(&self) -> http_body::SizeHint { http_body::Body::size_hint(&self.inner) } } }; } #[allow(unused_macros)] macro_rules! opaque_future { ($(#[$m:meta])* pub type $name:ident<$($param:ident),+> = $actual:ty;) => { pin_project_lite::pin_project! { $(#[$m])* pub struct $name<$($param),+> { #[pin] inner: $actual } } impl<$($param),+> $name<$($param),+> { pub(crate) fn new(inner: $actual) -> Self { Self { inner } } } impl<$($param),+> std::fmt::Debug for $name<$($param),+> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_tuple(stringify!($name)).field(&format_args!("...")).finish() } } impl<$($param),+> std::future::Future for $name<$($param),+> where $actual: std::future::Future, { type Output = <$actual as std::future::Future>::Output; #[inline] fn poll(self: std::pin::Pin<&mut Self>, cx: &mut std::task::Context<'_>) -> std::task::Poll { self.project().inner.poll(cx) } } } }