Skip to main content

behavior/supervision/
protocol.rs

1//! Typed event and command protocols used by supervision behaviors.
2
3use crate::protocol::{
4    ChildEvent, ChildStopped, PeerEvent, PeerStopped, ShutdownEvent, ShutdownRequested, TimeEvent,
5    TimerElapsed, WorkerEvent, WorkerStopped,
6};
7use crate::{Address, Behavior, User, UserEvent};
8
9#[derive(Clone, PartialEq, Eq)]
10pub enum SupervisionEvent<E, A: Address> {
11    Inner(E),
12    ChildStopped(ChildStopped<A>),
13    WorkerStopped(WorkerStopped<A>),
14}
15
16impl<E, A: Address> ChildEvent<A> for SupervisionEvent<E, A> {
17    fn child_stopped(event: ChildStopped<A>) -> Option<Self> {
18        Some(Self::ChildStopped(event))
19    }
20}
21
22impl<E, A: Address> WorkerEvent<A> for SupervisionEvent<E, A> {
23    fn worker_stopped(event: WorkerStopped<A>) -> Option<Self> {
24        Some(Self::WorkerStopped(event))
25    }
26}
27
28impl<E: UserEvent, A: Address> UserEvent for SupervisionEvent<E, A> {
29    type Addr = E::Addr;
30    type Message = E::Message;
31
32    fn user(from: Self::Addr, message: Self::Message) -> Self {
33        Self::Inner(E::user(from, message))
34    }
35
36    fn into_user(self) -> Result<User<Self::Addr, Self::Message>, Self> {
37        match self {
38            Self::Inner(event) => event.into_user().map_err(Self::Inner),
39            stopped @ (Self::ChildStopped(_) | Self::WorkerStopped(_)) => Err(stopped),
40        }
41    }
42}
43
44impl<E: TimeEvent, A: Address> TimeEvent for SupervisionEvent<E, A> {
45    fn time_reached(event: TimerElapsed) -> Option<Self> {
46        E::time_reached(event).map(Self::Inner)
47    }
48}
49
50impl<E: PeerEvent<A>, A: Address> PeerEvent<A> for SupervisionEvent<E, A> {
51    fn peer_stopped(event: PeerStopped<A>) -> Option<Self> {
52        E::peer_stopped(event).map(Self::Inner)
53    }
54}
55
56impl<E: ShutdownEvent, A: Address> ShutdownEvent for SupervisionEvent<E, A> {
57    fn shutdown_requested(event: ShutdownRequested) -> Option<Self> {
58        E::shutdown_requested(event).map(Self::Inner)
59    }
60}
61
62/// Commands accepted by a stable proxy.
63#[derive(Debug)]
64pub enum ProxyCommand<C: Behavior> {
65    Forward(C::Msg),
66    Replace(C),
67}