#[macro_export]
#[cfg_attr(docsrs, doc(cfg(feature = "macros")))]
macro_rules! try_join {
(@ {
// One `_` for each branch in the `try_join!` macro. This is not used once
// normalization is complete.
( $($count:tt)* )
$( ( $($skip:tt)* ) $e:expr, )*
}) => {{
use $crate::macros::support::{maybe_done, poll_fn, Future, Pin};
use $crate::macros::support::Poll::{Ready, Pending};
let mut futures = ( $( maybe_done($e), )* );
poll_fn(move |cx| {
let mut is_pending = false;
$(
let ( $($skip,)* fut, .. ) = &mut futures;
let mut fut = unsafe { Pin::new_unchecked(fut) };
if fut.as_mut().poll(cx).is_pending() {
is_pending = true;
} else if fut.as_mut().output_mut().expect("expected completed future").is_err() {
return Ready(Err(fut.take_output().expect("expected completed future").err().unwrap()))
}
)*
if is_pending {
Pending
} else {
Ready(Ok(($({
let ( $($skip,)* fut, .. ) = &mut futures;
let mut fut = unsafe { Pin::new_unchecked(fut) };
fut
.take_output()
.expect("expected completed future")
.ok()
.expect("expected Ok(_)")
},)*)))
}
}).await
}};
(@ { ( $($s:tt)* ) $($t:tt)* } $e:expr, $($r:tt)* ) => {
$crate::try_join!(@{ ($($s)* _) $($t)* ($($s)*) $e, } $($r)*)
};
( $($e:expr),* $(,)?) => {
$crate::try_join!(@{ () } $($e,)*)
};
}