use std::ops::{Deref, DerefMut};
use calloop::channel::{self, Channel, ChannelError, Event as ChannelEvent};
use calloop::{EventSource, Poll, PostAction, Readiness, Token, TokenFactory};
pub use notify;
use notify::{Event, RecommendedWatcher};
pub struct NotifySource {
watcher: RecommendedWatcher,
rx: Channel<Event>,
}
impl NotifySource {
pub fn new() -> Result<Self, notify::Error> {
let (tx, rx) = channel::channel();
let watcher = notify::recommended_watcher(move |event| {
if let Ok(event) = event {
let _ = tx.send(event);
}
})?;
Ok(Self { watcher, rx })
}
}
impl Deref for NotifySource {
type Target = RecommendedWatcher;
fn deref(&self) -> &Self::Target {
&self.watcher
}
}
impl DerefMut for NotifySource {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.watcher
}
}
impl EventSource for NotifySource {
type Error = ChannelError;
type Event = Event;
type Metadata = ();
type Ret = ();
fn process_events<F>(
&mut self,
readiness: Readiness,
token: Token,
mut callback: F,
) -> Result<PostAction, Self::Error>
where
F: FnMut(Self::Event, &mut Self::Metadata) -> Self::Ret,
{
self.rx.process_events(readiness, token, |event, metadata| match event {
ChannelEvent::Msg(msg) => callback(msg, metadata),
ChannelEvent::Closed => (),
})
}
fn register(
&mut self,
poll: &mut Poll,
token_factory: &mut TokenFactory,
) -> calloop::Result<()> {
self.rx.register(poll, token_factory)
}
fn reregister(
&mut self,
poll: &mut Poll,
token_factory: &mut TokenFactory,
) -> calloop::Result<()> {
self.rx.reregister(poll, token_factory)
}
fn unregister(&mut self, poll: &mut Poll) -> calloop::Result<()> {
self.rx.unregister(poll)
}
}