Skip to main content

behavior/timing/
event.rs

1//! The event coproduct shared by timer-based behavior compositions.
2
3use crate::behavior::{User, UserEvent};
4use crate::protocol::forward::forward_event_lane;
5use crate::protocol::{TimeEvent, TimerElapsed};
6
7#[derive(Debug, Clone, PartialEq, Eq)]
8pub enum TimedEvent<E> {
9    Inner(E),
10    Elapsed(TimerElapsed),
11}
12
13impl<E: UserEvent> TimeEvent for TimedEvent<E> {
14    fn time_reached(event: TimerElapsed) -> Option<Self> {
15        Some(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::Inner(E::user(from, message))
31    }
32
33    fn into_user(self) -> Result<User<Self::Addr, Self::Message>, Self> {
34        match self {
35            Self::Inner(event) => event.into_user().map_err(Self::Inner),
36            elapsed @ Self::Elapsed(_) => Err(elapsed),
37        }
38    }
39}
40
41forward_event_lane!(
42    TimedEvent,
43    PeerEvent,
44    peer_stopped,
45    crate::PeerStopped<E::Addr>
46);
47forward_event_lane!(
48    TimedEvent,
49    ChildEvent,
50    child_stopped,
51    crate::ChildStopped<E::Addr>
52);
53forward_event_lane!(
54    TimedEvent,
55    WorkerEvent,
56    worker_stopped,
57    crate::WorkerStopped<E::Addr>
58);
59forward_event_lane!(
60    TimedEvent,
61    CreationEvent,
62    creation_resolved,
63    crate::CreationResolved<<E::Addr as crate::Address>::Nonce>
64);
65forward_event_lane!(
66    TimedEvent,
67    WorkerCreationEvent,
68    worker_creation_resolved,
69    crate::WorkerCreationResolved<<E::Addr as crate::Address>::Nonce>
70);
71forward_event_lane!(
72    TimedEvent,
73    ShutdownEvent,
74    shutdown_requested,
75    crate::ShutdownRequested
76);