hotwatch 0.5.0

A Rust library for conveniently watching and handling file changes.
Documentation
use hotwatch::{EventKind, Hotwatch};
use std::{
    fs::File,
    io::BufReader,
    path::Path,
    sync::{
        atomic::{AtomicBool, Ordering},
        Arc,
    },
    time::Duration,
};

#[allow(dead_code)]
#[derive(Debug, serde::Deserialize)]
struct CuteGirl {
    name: String,
    hobby: String,
    favorite_color: String,
}

fn main() -> Result<(), failure::Error> {
    let mut watcher = Hotwatch::new_with_custom_delay(Duration::from_secs_f32(0.5))?;
    let path = Path::new(env!("CARGO_MANIFEST_DIR")).join("examples/data.json");
    let changed = AtomicBool::new(true).into();
    {
        let changed = Arc::clone(&changed);
        watcher.watch(&path, move |event| {
            if let EventKind::Modify(_) = event.kind {
                changed.store(true, Ordering::Release);
            }
        })?;
    }
    loop {
        if changed
            .compare_exchange(true, false, Ordering::AcqRel, Ordering::Acquire)
            .is_ok()
        {
            let file = File::open(&path)?;
            let mut reader = BufReader::new(file);
            match serde_json::from_reader::<_, Vec<CuteGirl>>(&mut reader) {
                Ok(cute_girls) => println!("{cute_girls:#?}"),
                Err(err) => println!("failed to deserialize json: {err}"),
            }
        }
    }
}