use crate::{Event, ListenerError, Priority};
pub trait EventListener<T: Event>: Send + Sync {
fn handle(&self, event: &T) -> Result<(), ListenerError>;
fn priority(&self) -> Priority {
Priority::Normal
}
}
type ListenerHandler = dyn Fn(&dyn Event) -> Result<(), ListenerError> + Send + Sync;
pub(crate) struct ListenerWrapper {
pub(crate) handler: Box<ListenerHandler>,
pub(crate) priority: Priority,
pub(crate) id: usize,
}
impl std::fmt::Debug for ListenerWrapper {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ListenerWrapper")
.field("priority", &self.priority)
.field("id", &self.id)
.field("handler", &"<function>")
.finish()
}
}
impl ListenerWrapper {
pub(crate) fn new<T, F>(listener: F, priority: Priority, id: usize) -> Self
where
T: Event + 'static,
F: Fn(&T) -> Result<(), ListenerError> + Send + Sync + 'static,
{
Self {
handler: Box::new(move |event: &dyn Event| {
if let Some(concrete_event) = event.as_any().downcast_ref::<T>() {
listener(concrete_event)
} else {
Ok(())
}
}),
priority,
id,
}
}
}