Skip to main content

stacksdapp_watcher/
lib.rs

1use anyhow::Result;
2use notify::{Config, RecommendedWatcher, RecursiveMode, Watcher};
3use std::path::Path;
4use std::time::Duration;
5use tokio::sync::mpsc;
6
7pub async fn watch_contracts(contracts_dir: &Path) -> Result<()> {
8    let (tx, mut rx) = mpsc::channel(32);
9    let mut watcher = RecommendedWatcher::new(
10        move |res| {
11            let _ = tx.blocking_send(res);
12        },
13        Config::default().with_poll_interval(Duration::from_millis(500)),
14    )?;
15
16    watcher.watch(contracts_dir, RecursiveMode::Recursive)?;
17
18    while let Some(event) = rx.recv().await {
19        if let Ok(e) = event {
20            if e.paths.iter().any(|p| {
21                p.extension()
22                    .map(|x| x == "clar")
23                    .unwrap_or(false)
24            }) {
25                println!("[watcher] .clar change detected — regenerating...");
26                if let Err(e) = stacksdapp_codegen::generate_all().await {
27                    eprintln!("[watcher] codegen error: {e}");
28                }
29            }
30        }
31    }
32
33    Ok(())
34}