use std::fmt;
use crate::{Actor, Broker, Handler, Mailbox};
pub enum SupervisionEvent<A: Actor> {
ActorStarted(Mailbox<A>),
ActorTerminated(Mailbox<A>),
ActorFailed(Mailbox<A>),
}
impl<A: Actor> SupervisionEvent<A> {
pub fn actor(&self) -> &Mailbox<A> {
match self {
Self::ActorStarted(actor) | Self::ActorTerminated(actor) | Self::ActorFailed(actor) => {
actor
}
}
}
}
impl<A: Actor> fmt::Debug for SupervisionEvent<A> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::ActorStarted(actor) => f.debug_tuple("ActorStarted").field(actor).finish(),
Self::ActorTerminated(actor) => f.debug_tuple("ActorTerminated").field(actor).finish(),
Self::ActorFailed(actor) => f.debug_tuple("ActorFailed").field(actor).finish(),
}
}
}
pub(crate) struct Supervision<A: Actor> {
broker: Broker<SupervisionEvent<A>>,
}
impl<A: Actor> Supervision<A> {
pub(crate) fn new<S>(supervisor: &Mailbox<S>) -> Self
where
S: Handler<SupervisionEvent<A>>,
{
Self {
broker: supervisor.broker(),
}
}
pub(crate) fn started(&self, actor: &Mailbox<A>) {
self.broker
.send(SupervisionEvent::ActorStarted(actor.clone()))
.ok();
}
pub(crate) fn terminated(&self, actor: &Mailbox<A>) {
self.broker
.send(SupervisionEvent::ActorTerminated(actor.clone()))
.ok();
}
pub(crate) fn failed(&self, actor: &Mailbox<A>) {
self.broker
.send(SupervisionEvent::ActorFailed(actor.clone()))
.ok();
}
}