use anyhow::Result;
use notify::{Config, Event as NotifyEvent, RecommendedWatcher, RecursiveMode, Watcher};
use std::path::Path;
use std::sync::mpsc::channel;
use std::time::Duration;
pub struct FileWatcher {
watcher: RecommendedWatcher,
}
impl FileWatcher {
pub fn new<F>(on_event: F) -> Result<Self>
where
F: Fn(NotifyEvent) + Send + 'static,
{
let (tx, rx) = channel();
let watcher = RecommendedWatcher::new(
move |res| {
if let Ok(event) = res {
let _ = tx.send(event);
}
},
Config::default().with_poll_interval(Duration::from_millis(100)),
)?;
std::thread::spawn(move || {
for event in rx {
on_event(event);
}
});
Ok(Self { watcher })
}
pub fn watch<P: AsRef<Path>>(&mut self, path: P) -> Result<()> {
self.watcher
.watch(path.as_ref(), RecursiveMode::Recursive)?;
Ok(())
}
}