extern crate alloc;
use alloc::{string::String, vec::Vec};
use crate::{Callback, EventError, EventPayload, Listener};
pub trait EventHandler<T> {
fn event_names(&self) -> Vec<String>;
fn set_max_listeners(&mut self, max: usize);
fn max_listeners(&self) -> usize;
fn add(
&mut self,
event_name: &str,
tag_name: Option<String>,
callback: Callback<T>,
) -> Result<Listener<T>, EventError>;
fn add_limited(
&mut self,
event_name: &str,
tag_name: Option<String>,
callback: Callback<T>,
limit: u64,
) -> Result<Listener<T>, EventError>;
fn add_once(
&mut self,
event_name: &str,
tag_name: Option<String>,
callback: Callback<T>,
) -> Result<Listener<T>, EventError>;
fn add_listener(&mut self, event_name: &str, listener: Listener<T>) -> Result<(), EventError>;
fn listener_count(&self, event_name: &str) -> Result<usize, EventError>;
fn has_listener(&self, event_name: &str) -> Result<bool, EventError> {
Ok(self.listener_count(event_name)? > 0)
}
fn remove_listener(
&mut self,
event_name: &str,
listener: &Listener<T>,
) -> Result<Listener<T>, EventError>;
fn remove_all_listeners(&mut self, event_name: &str) -> Result<Vec<Listener<T>>, EventError>;
fn emit(
&mut self,
event_name: &str,
payload: EventPayload<T>,
) -> Result<Vec<Listener<T>>, EventError>;
fn emit_final(
&mut self,
event_name: &str,
payload: EventPayload<T>,
) -> Result<Vec<Listener<T>>, EventError>;
}