Skip to main content

behavior/fold/
user_event.rs

1//! The user-message lane and its composition contracts.
2
3use crate::actor::Address;
4use crate::protocol::{
5    ChildEvent, ChildStopped, PeerEvent, PeerStopped, ShutdownEvent, ShutdownRequested, TimeEvent,
6    TimerElapsed, WorkerEvent, WorkerStopped,
7};
8
9/// The user-message event at the Agha floor.
10#[derive(Debug, Clone, PartialEq, Eq)]
11pub struct User<A, M> {
12    pub from: A,
13    pub message: M,
14}
15
16/// Construction/extraction of the user lane through a composed event type.
17pub trait UserEvent: Sized {
18    type Addr: Address;
19    type Message;
20
21    fn user(from: Self::Addr, message: Self::Message) -> Self;
22
23    /// # Errors
24    /// Returns the unchanged event when it belongs to another composed lane.
25    fn into_user(self) -> Result<User<Self::Addr, Self::Message>, Self>;
26}
27
28impl<A: Address, M> UserEvent for User<A, M> {
29    type Addr = A;
30    type Message = M;
31
32    fn user(from: A, message: M) -> Self {
33        Self { from, message }
34    }
35    fn into_user(self) -> Result<Self, Self> {
36        Ok(self)
37    }
38}
39
40impl<A: Address, M> TimeEvent for User<A, M> {
41    fn time_reached(_: TimerElapsed) -> Option<Self> {
42        None
43    }
44}
45impl<A: Address, M> PeerEvent<A> for User<A, M> {
46    fn peer_stopped(_: PeerStopped<A>) -> Option<Self> {
47        None
48    }
49}
50impl<A: Address, M> ChildEvent<A> for User<A, M> {
51    fn child_stopped(_: ChildStopped<A>) -> Option<Self> {
52        None
53    }
54}
55impl<A: Address, M> WorkerEvent<A> for User<A, M> {
56    fn worker_stopped(_: WorkerStopped<A>) -> Option<Self> {
57        None
58    }
59}
60impl<A: Address, M> ShutdownEvent for User<A, M> {
61    fn shutdown_requested(_: ShutdownRequested) -> Option<Self> {
62        None
63    }
64}