use crate::{Address, Become, Behavior, Crash, Exit, Step, SupervisionFailureReason};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Strategy {
OneForOne,
OneForAll,
RestForOne,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RestartPolicy {
Permanent,
Transient,
Temporary,
}
#[must_use]
pub const fn restart_one() -> Strategy {
Strategy::OneForOne
}
#[must_use]
pub const fn restart_all() -> Strategy {
Strategy::OneForAll
}
#[must_use]
pub const fn restart_rest() -> Strategy {
Strategy::RestForOne
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct SupervisionFailure<A: Address> {
pub child: A::Nonce,
pub outcome: Result<Exit<A>, Crash>,
pub reason: SupervisionFailureReason,
}
impl<A: Address> SupervisionFailure<A> {
#[must_use]
pub const fn new(
child: A::Nonce,
outcome: Result<Exit<A>, Crash>,
reason: SupervisionFailureReason,
) -> Self {
Self {
child,
outcome,
reason,
}
}
#[must_use]
pub const fn into_exit(self) -> Exit<A> {
Exit::SupervisionFailed(self.reason)
}
}
pub type SupervisionFailureReaction<B> =
fn(
&mut B,
&SupervisionFailure<<B as Behavior>::Addr>,
) -> Result<Become<<B as Behavior>::Addr>, <B as Behavior>::Error>;
pub fn retire_on_supervision_failure<B: Behavior>(
_behavior: &mut B,
_failure: &SupervisionFailure<B::Addr>,
) -> Result<Become<B::Addr>, B::Error> {
Ok(Step::Continue)
}
pub fn stop_on_supervision_failure<B: Behavior>(
_behavior: &mut B,
failure: &SupervisionFailure<B::Addr>,
) -> Result<Become<B::Addr>, B::Error> {
Ok(Step::Stop(failure.into_exit()))
}