1use futures::channel::mpsc;
2use crate::event::*;
3
4
5pub trait Sender {
7 type Event: IsEvent<Event = Self::Event>;
8
9 fn get_sender_component_mut(&mut self) -> &mut SenderComponent<Self::Event>;
11
12 fn get_sender_component(&self) -> &SenderComponent<Self::Event>;
14
15 fn set_sender_component(&mut self, sender_component: SenderComponent<Self::Event>) {
17 *self.get_sender_component_mut() = sender_component;
18 }
19
20 fn get_sender(&self) -> mpsc::UnboundedSender<Envelope<Self::Event>> {
22 self.get_sender_component().sender.as_ref().unwrap().clone()
23 }
24
25 fn set_sender(&mut self, sender: mpsc::UnboundedSender<Envelope<Self::Event>>) {
27 self.get_sender_component_mut().sender = Some(sender);
28 }
29
30 fn clear_sender(&mut self) {
32 self.get_sender_component_mut().sender = None;
33 }
34
35 fn set_associated_handler_id(&mut self, id: usize) {
38 self.get_sender_component_mut().associated_handler_id = Some(id);
39 }
40
41 fn get_associated_handler_id(&self) -> Option<usize> {
43 self.get_sender_component().associated_handler_id
44 }
45
46 fn clear_associated_handler_id(&mut self) {
48 self.get_sender_component_mut().associated_handler_id = None;
49 }
50
51 fn publish(&self, event: Self::Event) {
53 let envelope = Envelope {
54 destination: Destination::All,
55 event
56 };
57 self.send(envelope);
58 }
59
60 fn post(&self, event: Self::Event, handler_id: usize) {
62 let envelope = Envelope {
63 destination: Destination::Single(handler_id),
64 event
65 };
66 self.send(envelope);
67 }
68
69 fn post_to_self(&self, event: Self::Event) {
71 let id = self.get_associated_handler_id().expect(
72 "Stator must be attached to commutator");
73 self.post(event, id);
74 }
75
76 fn send(&self, envelope: Envelope<Self::Event>) {
78 let sender_component = self.get_sender_component();
79 if let Some(sender) = &sender_component.sender {
80 let _ = sender.unbounded_send(envelope);
81 } else {
82 panic!("no event sender set");
83 }
84 }
85
86}
87
88#[derive(Clone, Debug)]
89pub struct SenderComponent<E>
90where
91E: IsEvent<Event = E> {
92 sender: Option<mpsc::UnboundedSender<Envelope<E>>>,
93 associated_handler_id: Option<usize>
94}
95
96impl<E> Default for SenderComponent<E>
97where
98E: IsEvent<Event = E> {
99
100 fn default() -> Self {
101 Self {
102 sender: None,
103 associated_handler_id: None
104 }
105 }
106
107}
108
109impl<E: IsEvent<Event = E>> Sender for SenderComponent<E> {
110 type Event = E;
111
112 fn get_sender_component_mut(&mut self) -> &mut SenderComponent<Self::Event> {
113 self
114 }
115
116 fn get_sender_component(&self) -> &SenderComponent<Self::Event> {
117 self
118 }
119
120}