axum/
macros.rs

1//! Internal macros
2
3macro_rules! opaque_future {
4    ($(#[$m:meta])* pub type $name:ident = $actual:ty;) => {
5        opaque_future! {
6            $(#[$m])*
7            pub type $name<> = $actual;
8        }
9    };
10
11    ($(#[$m:meta])* pub type $name:ident<$($param:ident),*> = $actual:ty;) => {
12        pin_project_lite::pin_project! {
13            $(#[$m])*
14            pub struct $name<$($param),*> {
15                #[pin] future: $actual,
16            }
17        }
18
19        impl<$($param),*> $name<$($param),*> {
20            pub(crate) fn new(future: $actual) -> Self {
21                Self { future }
22            }
23        }
24
25        impl<$($param),*> std::fmt::Debug for $name<$($param),*> {
26            fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
27                f.debug_struct(stringify!($name)).finish_non_exhaustive()
28            }
29        }
30
31        impl<$($param),*> std::future::Future for $name<$($param),*>
32        where
33            $actual: std::future::Future,
34        {
35            type Output = <$actual as std::future::Future>::Output;
36
37            #[inline]
38            fn poll(
39                self: std::pin::Pin<&mut Self>,
40                cx: &mut std::task::Context<'_>,
41            ) -> std::task::Poll<Self::Output> {
42                self.project().future.poll(cx)
43            }
44        }
45    };
46}
47
48#[rustfmt::skip]
49macro_rules! all_the_tuples {
50    ($name:ident) => {
51        $name!([], T1);
52        $name!([T1], T2);
53        $name!([T1, T2], T3);
54        $name!([T1, T2, T3], T4);
55        $name!([T1, T2, T3, T4], T5);
56        $name!([T1, T2, T3, T4, T5], T6);
57        $name!([T1, T2, T3, T4, T5, T6], T7);
58        $name!([T1, T2, T3, T4, T5, T6, T7], T8);
59        $name!([T1, T2, T3, T4, T5, T6, T7, T8], T9);
60        $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9], T10);
61        $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9, T10], T11);
62        $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11], T12);
63        $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12], T13);
64        $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13], T14);
65        $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14], T15);
66        $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15], T16);
67    };
68}
69
70#[cfg(feature = "tracing")]
71#[allow(unused_macros)]
72macro_rules! trace {
73    ($($tt:tt)*) => {
74        tracing::trace!($($tt)*)
75    }
76}
77
78#[cfg(feature = "tracing")]
79#[allow(unused_macros)]
80macro_rules! error {
81    ($($tt:tt)*) => {
82        tracing::error!($($tt)*)
83    };
84}
85
86#[cfg(not(feature = "tracing"))]
87#[allow(unused_macros)]
88macro_rules! trace {
89    ($($tt:tt)*) => {};
90}
91
92#[cfg(not(feature = "tracing"))]
93#[allow(unused_macros)]
94macro_rules! error {
95    ($($tt:tt)*) => {};
96}