#[macro_export]
macro_rules! try_recover {
($try_expr:expr, $recoverable:expr) => {{ $crate::try_recover!($try_expr, $recoverable, _) }};
($try_expr:expr, $recoverable:expr, $new_state:ty) => {{
match $try_expr {
Ok(ok) => ok,
Err(err) => {
let new_stateful =
<_ as $crate::Transitionable<$new_state>>::transition($recoverable);
return Err($crate::Recovered::new(new_stateful, err.into()));
}
}
}};
}
#[macro_export]
macro_rules! try_recover_async {
($try_expr:expr, $recoverable:expr) => {{ $crate::try_recover_async!($try_expr, $recoverable, _) }};
($try_expr:expr, $recoverable:expr, $new_state:ty) => {{
match $try_expr.await {
Ok(ok) => ok,
Err(err) => {
let new_stateful =
<_ as $crate::AsyncTransitionable<$new_state>>::transition($recoverable).await;
return Err($crate::Recovered::new(new_stateful, err.into()));
}
}
}};
}
#[macro_export]
macro_rules! return_recover {
($recoverable:expr, $fmt:literal $(, $args:expr )*) => {{
$crate::return_recover!($recoverable, _, $fmt $(, $args )*)
}};
($recoverable:expr, $target:ty, $fmt:literal $(, $args:expr )*) => {{
return Err(
$crate::Recovered::new(
<_ as $crate::Transitionable<$target>>::transition($recoverable),
$crate::TransitionError::new(::std::format!($fmt $(, $args )*)).into()
)
);
}};
}
#[macro_export]
macro_rules! return_recover_async {
($recoverable:expr, $fmt:literal $(, $args:expr )*) => {{
$crate::return_recover_async!($recoverable, _, $fmt $(, $args )*)
}};
($recoverable:expr, $target:ty, $fmt:literal $(, $args:expr )*) => {{
return Err(
$crate::Recovered::new(
<_ as $crate::AsyncTransitionable<$target>>::transition($recoverable).await,
$crate::TransitionError::new(::std::format!($fmt $(, $args )*)).into()
)
);
}};
}
#[macro_export]
macro_rules! try_transition_continue {
($stateful:expr, $original_binding:ident) => {{ $crate::try_transition_continue!($stateful, $original_binding, |_| {}) }};
($stateful:expr, $original_binding:ident, $error_handling:expr) => {{
match <_ as $crate::TryTransitionable<_, _>>::try_transition($stateful) {
Ok(ok) => ok,
Err(recovered) => {
$error_handling(recovered.error);
$original_binding = recovered.stateful;
continue;
}
}
}};
}
#[macro_export]
macro_rules! try_transition_continue_async {
($stateful:expr, $original_binding:ident) => {{ $crate::try_transition_continue_async!($stateful, $original_binding, |_| async {}) }};
($stateful:expr, $original_binding:ident, $error_handling:expr) => {{
match <_ as $crate::AsyncTryTransitionable<_, _>>::try_transition($stateful).await {
Ok(ok) => ok,
Err(recovered) => {
$error_handling(recovered.error).await;
$original_binding = recovered.stateful;
continue;
}
}
}};
}
#[macro_export]
macro_rules! try_transition_inner_recover {
($inner:expr, $recover_constructor:expr) => {{ $crate::try_transition_inner_recover!($inner, _, _, $recover_constructor) }};
($inner:expr, $inner_recovered_state:ty, $recover_constructor:expr) => {{ $crate::try_transition_inner_recover!($inner, _, $inner_recovered_state, $recover_constructor) }};
($inner:expr, $inner_target_state: ty, $inner_recovered_state:ty, $recover_constructor:expr) => {{
match <_ as $crate::TryTransitionable<$inner_target_state, $inner_recovered_state>>::try_transition(
$inner,
) {
Ok(ok) => ok,
Err(recovered) => {
let inner_recovered =
<_ as $crate::Transitionable<$inner_recovered_state>>::transition(recovered.stateful);
let new_stateful = $recover_constructor(inner_recovered);
let error = recovered.error;
return Err($crate::Recovered::new(new_stateful, error));
}
}
}};
}
#[macro_export]
macro_rules! try_transition_inner_recover_async {
($inner:expr, $recover_constructor:expr) => {{
$crate::try_transition_inner_recover_async!($inner, _, _, $recover_constructor)
}};
($inner:expr, $inner_recovered_state:ty, $recover_constructor:expr) => {{
$crate::try_transition_inner_recover_async!($inner, _, $inner_recovered_state, $recover_constructor)
}};
($inner:expr, $inner_target_state: ty, $inner_recovered_state:ty, $recover_constructor:expr) => {{
match <_ as $crate::AsyncTryTransitionable<$inner_target_state, $inner_recovered_state>>::try_transition($inner).await
{
Ok(ok) => ok,
Err(recovered) => {
let inner_recovered =
<_ as $crate::AsyncTransitionable<$inner_recovered_state>>::transition(
recovered.stateful,
)
.await;
let new_stateful = $recover_constructor(inner_recovered).await;
let error = recovered.error;
return Err($crate::Recovered::new(new_stateful, error));
}
}
}};
}
#[macro_export]
macro_rules! transition {
($stateful:expr) => {{ $crate::transition!($stateful, _) }};
($stateful:expr, $state:ty) => {{ <_ as $crate::Transitionable<$state>>::transition($stateful) }};
}
#[macro_export]
macro_rules! transition_async {
($stateful:expr) => {{ $crate::transition_async!($stateful, _) }};
($stateful:expr, $state:ty) => {{ <_ as $crate::AsyncTransitionable<$state>>::transition($stateful).await }};
}
#[macro_export]
macro_rules! try_transition {
($stateful:expr) => {{ $crate::try_transition!($stateful, _) }};
($stateful:expr, $next_state:ty) => {{ $crate::try_transition!($stateful, $next_state, _) }};
($stateful:expr, $next_state:ty, $recovery_state:ty) => {{ <_ as $crate::TryTransitionable<$next_state, $recovery_state>>::try_transition($stateful) }};
}
#[macro_export]
macro_rules! try_transition_async {
($stateful:expr) => {{ $crate::try_transition_async!($stateful, _) }};
($stateful:expr, $next_state:ty) => {{ $crate::try_transition_async!($stateful, $next_state, _) }};
($stateful:expr, $next_state:ty, $recovery_state:ty) => {{
<_ as $crate::AsyncTryTransitionable<$next_state, $recovery_state>>::try_transition(
$stateful,
)
.await
}};
}