diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.rs | 2 | ||||
| -rw-r--r-- | src/utils/watcher.rs | 22 |
2 files changed, 16 insertions, 8 deletions
diff --git a/src/main.rs b/src/main.rs index 8fb57340..7252d4ca 100644 --- a/src/main.rs +++ b/src/main.rs @@ -231,7 +231,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> { // Set up config file watcher. let _watcher = { let (tx, rx) = calloop::channel::sync_channel(1); - let watcher = Watcher::new(watch_path.clone(), tx); + let watcher = Watcher::new(watch_path.clone(), |_| (), tx); event_loop .handle() .insert_source(rx, move |event, _, state| match event { diff --git a/src/utils/watcher.rs b/src/utils/watcher.rs index 84fdab5c..069e67f8 100644 --- a/src/utils/watcher.rs +++ b/src/utils/watcher.rs @@ -1,6 +1,6 @@ //! File modification watcher. -use std::path::PathBuf; +use std::path::{Path, PathBuf}; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::{mpsc, Arc}; use std::thread; @@ -19,13 +19,18 @@ impl Drop for Watcher { } impl Watcher { - pub fn new(path: PathBuf, changed: SyncSender<()>) -> Self { - Self::with_start_notification(path, changed, None) + pub fn new<T: Send + 'static>( + path: PathBuf, + process: impl FnMut(&Path) -> T + Send + 'static, + changed: SyncSender<T>, + ) -> Self { + Self::with_start_notification(path, process, changed, None) } - pub fn with_start_notification( + pub fn with_start_notification<T: Send + 'static>( path: PathBuf, - changed: SyncSender<()>, + mut process: impl FnMut(&Path) -> T + Send + 'static, + changed: SyncSender<T>, started: Option<mpsc::SyncSender<()>>, ) -> Self { let should_stop = Arc::new(AtomicBool::new(false)); @@ -66,7 +71,9 @@ impl Watcher { if last_props.as_ref() != Some(&new_props) { trace!("file changed: {}", path.to_string_lossy()); - if let Err(err) = changed.send(()) { + let rv = process(&path); + + if let Err(err) = changed.send(rv) { warn!("error sending change notification: {err:?}"); break; } @@ -123,7 +130,8 @@ mod tests { let (tx, rx) = sync_channel(1); let (started_tx, started_rx) = mpsc::sync_channel(1); - let _watcher = Watcher::with_start_notification(config_path.clone(), tx, Some(started_tx)); + let _watcher = + Watcher::with_start_notification(config_path.clone(), |_| (), tx, Some(started_tx)); loop_handle .insert_source(rx, |_, _, _| { changed.fetch_add(1, Ordering::SeqCst); |
