behavior/supervision/
protocol.rs1use 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#[derive(Debug)]
64pub enum ProxyCommand<C: Behavior> {
65 Forward(C::Msg),
66 Replace(C),
67}