1use std::sync::Arc;
2
3use anyhow::Result;
4
5use crate::{entry::Entry, event::Event, queue::EventQueue};
6
7#[derive(Default, Clone)]
8pub struct Handler {
9 pub entries: Vec<Entry>,
10}
11
12impl Handler {
13 pub fn new(entries: Vec<Entry>) -> Self {
14 Self { entries }
15 }
16
17 pub fn empty() -> Self {
18 Self { entries: vec![] }
19 }
20
21 pub fn extend<E: IntoIterator<Item = Entry>>(&mut self, entries: E) {
22 self.entries.extend(entries);
23 }
24
25 pub async fn input(&self, event: Arc<Box<dyn Event>>) -> Result<()> {
26 let mut queue = self.matches(&**event);
27 while let Some(entry) = queue.pop() {
28 entry.get_handler()(event.clone()).await?;
29 }
30 Ok(())
31 }
32
33 #[inline]
34 pub fn matches(&self, event: &dyn Event) -> EventQueue<Entry> {
35 let mut queue = EventQueue::new();
36 for entry in self.entries.iter() {
37 if entry.get_router().matches(event) {
38 queue.push(entry.get_priority(), entry.clone());
39 }
40 }
41 queue
42 }
43}
44
45unsafe impl Send for Handler {}
46unsafe impl Sync for Handler {}