use enumset::EnumSet;
use crate::propagation::DomainEvent;
use crate::propagation::DomainEvents;
use crate::propagation::LocalId;
use crate::variables::DomainId;
pub trait EventTarget {
fn register(
&self,
registration: &mut impl EventDispatcher,
events: EnumSet<DomainEvent>,
local_id: LocalId,
);
}
pub trait EventDispatcher {
fn register(&mut self, domain_id: DomainId, events: EnumSet<DomainEvent>, local_id: LocalId);
}
#[derive(Clone, Debug)]
pub struct EventsToRegister(Vec<(DomainId, EnumSet<DomainEvent>, LocalId)>);
impl EventsToRegister {
pub fn empty() -> EventsToRegister {
EventsToRegister(vec![])
}
pub fn builder() -> EventsToRegisterBuilder {
EventsToRegisterBuilder {
registrations: EventsToRegister(vec![]),
}
}
pub fn add(
&mut self,
target: &impl EventTarget,
domain_events: DomainEvents,
local_id: LocalId,
) {
target.register(self, domain_events.events(), local_id);
}
pub fn iter(&self) -> impl ExactSizeIterator<Item = (DomainId, EnumSet<DomainEvent>, LocalId)> {
self.0.iter().copied()
}
}
impl EventDispatcher for EventsToRegister {
fn register(&mut self, domain_id: DomainId, events: EnumSet<DomainEvent>, local_id: LocalId) {
self.0.push((domain_id, events, local_id));
}
}
#[derive(Clone, Debug)]
pub struct EventsToRegisterBuilder {
registrations: EventsToRegister,
}
impl EventsToRegisterBuilder {
pub fn add(
mut self,
target: &impl EventTarget,
domain_events: DomainEvents,
local_id: LocalId,
) -> Self {
self.registrations.add(target, domain_events, local_id);
self
}
pub fn build(self) -> EventsToRegister {
assert!(
!self.registrations.0.is_empty(),
"did not register for any events"
);
self.registrations
}
}