Skip to main content

aionbot_core/
handler.rs

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 {}