calloop-dbus 0.1.1

EventSource to use DBus with the calloop event loop.
Documentation
use dbus::{channel::Token, message::MatchRule, Message};

use log::trace;

use std::collections::BTreeMap;

pub struct Filters<F> {
    list: BTreeMap<dbus::channel::Token, (MatchRule<'static>, F)>,
    next_id: dbus::channel::Token,
}

impl<F> Default for Filters<F> {
    fn default() -> Self {
        Self {
            list: Default::default(),
            next_id: dbus::channel::Token(1),
        }
    }
}

impl<F> Filters<F> {
    pub fn add(&mut self, m: MatchRule<'static>, f: F) -> Token {
        let id = self.next_id;
        self.next_id.0 += 1;
        trace!("inserted token {} with value {:?}", id.0, &m);
        self.list.insert(id, (m, f));
        id
    }

    pub fn remove(&mut self, id: Token) -> Option<(MatchRule<'static>, F)> {
        trace!("removed token {}", id.0);
        self.list.remove(&id)
    }

    pub fn get_matches(
        &mut self,
        m: &Message,
    ) -> Option<(&dbus::channel::Token, &mut (MatchRule<'static>, F))> {
        self.list.iter_mut().find(|(_, v)| v.0.matches(m))
    }
}