#[macro_export]
macro_rules! children {
($($keys:ident: $vals:expr,)*) => {
children!(@sort,
1,
$crate::Callbacks::default(),
|_| {},
,
$($keys: $vals,)*
)
};
(@sort,
$_:expr, $cbs:expr, $action:expr, $($sp:expr)?,
redundancy: $red:expr,
$($keys:ident: $vals:expr,)*) => {
children!(@sort,
$red,
$cbs,
$action,
$($sp)?,
$($keys: $vals,)*
)
};
(@sort,
$red:expr, $_:expr, $action:expr, $($sp:expr)?,
callbacks: $cbs:expr,
$($keys:ident: $vals:expr,)*) => {
children!(@sort,
$red,
$cbs,
$action,
$($sp)?,
$($keys: $vals,)*
)
};
(@sort,
$red:expr, $cbs:expr, $action:expr, $($_:expr)?,
supervisor: $sp:expr,
$($keys:ident: $vals:expr,)*) => {
children!(@sort,
$red,
$cbs,
$action,
$sp,
$($keys: $vals,)*
)
};
(@sort,
$red:expr, $cbs:expr, $_:expr, $($sp:expr)?,
action: $action:expr,
$($keys:ident: $vals:expr,)*) => {
children!(@sort,
$red,
$cbs,
$action,
$($sp)?,
$($keys: $vals,)*
)
};
(@sort, $red:expr, $cbs:expr, $action:expr, ,) => {
$crate::Bastion::children(|ch| {
ch
.with_callbacks($cbs)
.with_redundancy($red)
.with_exec(|ctx: $crate::context::BastionContext| {
async move {
let ctx = ctx;
loop {
let msg = ctx.recv().await?;
($action)(msg);
}
}
})
}).expect("failed to create children group");
};
(@sort, $red:expr, $cbs:expr, $action:expr, $sp:expr,) => {
$sp.children(|ch| {
ch
.with_callbacks($cbs)
.with_redundancy($red)
.with_exec(|ctx: $crate::context::BastionContext| {
async move {
let ctx = ctx;
loop {
let msg = ctx.recv().await?;
($action)(msg);
}
}
})
}).expect("failed to create children group");
};
}
#[macro_export]
macro_rules! supervisor {
($($keys:ident: $vals:expr,)*) => {
supervisor!(@sort,
$crate::supervisor::SupervisionStrategy::OneForAll,
$crate::Callbacks::default(),
$($keys: $vals,)*
)
};
(@sort,
$strat:expr, $_:expr,
callbacks: $cbs:expr,
$($keys:ident: $vals:expr,)*) => {
supervisor!(@sort,
$strat,
$cbs,
$($keys: $vals,)*
)
};
(@sort,
$_:expr, $cbs:expr,
strategy: $strat:expr,
$($keys:ident: $vals:expr,)*) => {
supervisor!(@sort,
$strat,
$cbs,
$($keys: $vals,)*
)
};
(@sort, $strat:expr, $cbs:expr,) => {
$crate::Bastion::supervisor(|sp| {
sp
.with_callbacks($cbs)
.with_strategy($strat)
}).expect("failed to create supervisor");
};
}
#[macro_export]
macro_rules! blocking {
($($tokens:tt)*) => {
$crate::executor::blocking(async move {
$($tokens)*
})
};
}
#[macro_export]
macro_rules! run {
($action:expr) => {
$crate::executor::run($action)
};
($($tokens:tt)*) => {
bastion::executor::run(async move {$($tokens)*})
};
}
#[macro_export]
macro_rules! spawn {
($action:expr) => {
$crate::executor::spawn($action)
};
($($tokens:tt)*) => {
bastion::executor::spawn(async move {$($tokens)*})
};
}
#[doc(hidden)]
macro_rules! distributed_api {
($($block:item)*) => {
$(
#[cfg(feature = "distributed")]
#[cfg_attr(feature = "docs", doc(cfg(distributed)))]
$block
)*
}
}