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