devalang_core/utils/
watcher.rs

1use 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}