| #[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<Option<Result<http_body::Frame<Self::Data>, 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::Output> { |
| self.project().inner.poll(cx) |
| } |
| } |
| } |
| } |