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")]
71macro_rules! trace {
72    ($($tt:tt)*) => {
73        tracing::trace!($($tt)*)
74    }
75}
76
77#[cfg(feature = "tracing")]
78macro_rules! error {
79    ($($tt:tt)*) => {
80        tracing::error!($($tt)*)
81    };
82}
83
84#[cfg(not(feature = "tracing"))]
85macro_rules! trace {
86    ($($tt:tt)*) => {};
87}
88
89#[cfg(not(feature = "tracing"))]
90macro_rules! error {
91    ($($tt:tt)*) => {};
92}