use std::collections::VecDeque;
use crate::theme::Theme;
#[derive(Clone, Debug, PartialEq)]
pub enum Event {
ThemeChanged(Theme),
UserUpdated,
PluginMessage {
from: String,
to: String,
action: String,
data: String,
},
}
pub type EventSubscriber = Box<dyn FnMut(&Event) + Send>;
pub struct EventBus {
pending: VecDeque<Event>,
subscribers: Vec<EventSubscriber>,
}
const MAX_PENDING: usize = 1024;
impl EventBus {
pub fn new() -> Self {
Self {
pending: VecDeque::new(),
subscribers: Vec::new(),
}
}
pub fn subscribe(&mut self, f: EventSubscriber) {
self.subscribers.push(f);
}
pub fn emit(&mut self, event: Event) {
for sub in &mut self.subscribers {
sub(&event);
}
if self.pending.len() >= MAX_PENDING {
self.pending.pop_front();
}
self.pending.push_back(event);
}
pub fn drain(&mut self) -> Vec<Event> {
self.pending.drain(..).collect()
}
}
impl std::fmt::Debug for EventBus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("EventBus")
.field("pending", &self.pending)
.field(
"subscribers",
&format_args!("{} subscribers", self.subscribers.len()),
)
.finish()
}
}
impl Default for EventBus {
fn default() -> Self {
Self::new()
}
}