From eb8bd3894a188d34d870f4d79813f75163a318b8 Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Wed, 12 Feb 2025 20:53:19 +0300 Subject: watcher: Allow running a processing function on the thread --- src/utils/watcher.rs | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'src/utils') 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( + path: PathBuf, + process: impl FnMut(&Path) -> T + Send + 'static, + changed: SyncSender, + ) -> Self { + Self::with_start_notification(path, process, changed, None) } - pub fn with_start_notification( + pub fn with_start_notification( path: PathBuf, - changed: SyncSender<()>, + mut process: impl FnMut(&Path) -> T + Send + 'static, + changed: SyncSender, started: Option>, ) -> 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); -- cgit