use futures::channel::mpsc;
use crate::event::*;
pub trait Sender {
type Event: IsEvent<Event = Self::Event>;
fn get_sender_component_mut(&mut self) -> &mut SenderComponent<Self::Event>;
fn get_sender_component(&self) -> &SenderComponent<Self::Event>;
fn set_sender_component(&mut self, sender_component: SenderComponent<Self::Event>) {
*self.get_sender_component_mut() = sender_component;
}
fn get_sender(&self) -> mpsc::UnboundedSender<Envelope<Self::Event>> {
self.get_sender_component().sender.as_ref().unwrap().clone()
}
fn set_sender(&mut self, sender: mpsc::UnboundedSender<Envelope<Self::Event>>) {
self.get_sender_component_mut().sender = Some(sender);
}
fn clear_sender(&mut self) {
self.get_sender_component_mut().sender = None;
}
fn set_associated_handler_id(&mut self, id: usize) {
self.get_sender_component_mut().associated_handler_id = Some(id);
}
fn get_associated_handler_id(&self) -> Option<usize> {
self.get_sender_component().associated_handler_id
}
fn clear_associated_handler_id(&mut self) {
self.get_sender_component_mut().associated_handler_id = None;
}
fn publish(&self, event: Self::Event) {
let envelope = Envelope {
destination: Destination::All,
event
};
self.send(envelope);
}
fn post(&self, event: Self::Event, handler_id: usize) {
let envelope = Envelope {
destination: Destination::Single(handler_id),
event
};
self.send(envelope);
}
fn post_to_self(&self, event: Self::Event) {
let id = self.get_associated_handler_id().expect(
"Stator must be attached to commutator");
self.post(event, id);
}
fn send(&self, envelope: Envelope<Self::Event>) {
let sender_component = self.get_sender_component();
if let Some(sender) = &sender_component.sender {
let _ = sender.unbounded_send(envelope);
} else {
panic!("no event sender set");
}
}
}
#[derive(Clone, Debug)]
pub struct SenderComponent<E>
where
E: IsEvent<Event = E> {
sender: Option<mpsc::UnboundedSender<Envelope<E>>>,
associated_handler_id: Option<usize>
}
impl<E> Default for SenderComponent<E>
where
E: IsEvent<Event = E> {
fn default() -> Self {
Self {
sender: None,
associated_handler_id: None
}
}
}
impl<E: IsEvent<Event = E>> Sender for SenderComponent<E> {
type Event = E;
fn get_sender_component_mut(&mut self) -> &mut SenderComponent<Self::Event> {
self
}
fn get_sender_component(&self) -> &SenderComponent<Self::Event> {
self
}
}