devalang_core/utils/
watcher.rs

1use notify::{ Watcher, RecursiveMode, Config, RecommendedWatcher };
2use std::sync::mpsc::channel;
3
4use std::time::{ Duration, Instant };
5
6pub fn watch_directory<F>(entry: String, callback: F) -> notify::Result<()>
7    where F: Fn() + Send + 'static
8{
9    let (tx, rx) = channel();
10
11    let mut watcher: RecommendedWatcher = Watcher::new(tx, Config::default())?;
12    watcher.watch(&entry.as_ref(), RecursiveMode::Recursive)?;
13
14    let mut last_trigger = Instant::now();
15
16    loop {
17        match rx.recv() {
18            Ok(_) => {
19                let now = Instant::now();
20                if now.duration_since(last_trigger) > Duration::from_millis(200) {
21                    callback();
22                    last_trigger = now;
23                }
24            }
25            Err(e) => {
26                eprintln!("Channel error: {:?}", e);
27                break;
28            }
29        }
30    }
31
32    Ok(())
33}