use std::path::Path; use notify::{Config, Event, RecommendedWatcher, RecursiveMode, Watcher}; use tokio::sync::mpsc::channel; use tracing::{error, info, instrument}; use crate::Besult; pub type FileWatcher = RecommendedWatcher; pub mod prelude { pub use super::{file_watcher, FileWatcher}; } pub fn file_watcher(dir: P, cb: F) -> Besult where P: AsRef, F: Fn(Event) -> () + std::marker::Send + 'static, { let (tx, mut rx) = channel(1); let mut watcher = RecommendedWatcher::new( move |res| match res { Ok(e) => futures::executor::block_on(async { tx.send(e).await.unwrap(); }), Err(e) => error!("Error from file_watcher: {e}"), }, Config::default(), )?; info!("Watching directory '{}'", dir.as_ref().display()); tokio::spawn(async move { while let Some(ev) = rx.recv().await { cb(ev) } }); watcher.watch(dir.as_ref(), RecursiveMode::Recursive)?; Ok(watcher) }