1use crate::behavior::{User, UserEvent};
4use crate::protocol::TimerElapsed;
5use crate::protocol::forward::forward_event_lane;
6
7#[derive(Debug, Clone, PartialEq, Eq)]
8pub enum TimedEvent<E> {
9 Behavior(E),
10 Elapsed(TimerElapsed),
11}
12
13impl<E: UserEvent> crate::RouteInput<TimerElapsed> for TimedEvent<E> {
14 fn route(event: TimerElapsed) -> Result<Self, TimerElapsed> {
15 Ok(Self::Elapsed(event))
16 }
17}
18
19impl<E: UserEvent> crate::EventInput<TimerElapsed> for TimedEvent<E> {
20 fn inject(event: TimerElapsed) -> Self {
21 Self::Elapsed(event)
22 }
23}
24
25impl<E: UserEvent> UserEvent for TimedEvent<E> {
26 type Addr = E::Addr;
27 type Message = E::Message;
28
29 fn user(from: Self::Addr, message: Self::Message) -> Self {
30 Self::Behavior(E::user(from, message))
31 }
32
33 fn into_user(self) -> Result<User<Self::Addr, Self::Message>, Self> {
34 match self {
35 Self::Behavior(event) => event.into_user().map_err(Self::Behavior),
36 elapsed @ Self::Elapsed(_) => Err(elapsed),
37 }
38 }
39}
40
41forward_event_lane!(TimedEvent, crate::PeerStopped<E::Addr>);
42forward_event_lane!(TimedEvent, crate::ChildStopped<E::Addr>);
43forward_event_lane!(TimedEvent, crate::WorkerStopped<E::Addr>);
44forward_event_lane!(
45 TimedEvent,
46 crate::CreationResolved<<E::Addr as crate::Address>::Nonce>
47);
48forward_event_lane!(
49 TimedEvent,
50 crate::WorkerCreationResolved<<E::Addr as crate::Address>::Nonce>
51);
52forward_event_lane!(TimedEvent, crate::ShutdownRequested);