devalang_core/utils/
watcher.rs1use 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}