# Quadoculars [![Crates.io](https://img.shields.io/crates/v/quadoculars.svg)](https://crates.io/crates/quadoculars) [![Rust](https://github.com/Ar37-rs/quadoculars/actions/workflows/rust.yml/badge.svg)](https://github.com/Ar37-rs/quadoculars/actions/workflows/rust.yml) Concurrent, composable simple file watcher on top of notify-rs. ## Features * easy to use single and multiple files watcher * only notify when data of the file changes * fault tolerant, continue watching even if the file being replaced and gracefully shutdown itself when the file no longer exist. * fast live reloading values for DeserializeToOwned stuct. ## Installation Add `quadoculars` as a dependency in your `Cargo.toml`: ```toml quadoculars = "*" ``` or ```toml quadoculars = { git = "https://github.com/Ar37-rs/quadoculars.git" } ``` ## Quick Example ```rust use quadoculars::{Fstate, Watch}; use std::{ io::Result, path::{Path, PathBuf}, str::FromStr, sync::mpsc::channel, }; fn main() -> Result<()> { let file: PathBuf; { match PathBuf::from_str("filename.extention") { Ok(file_) => file = file_, _ => file = Path::new("otherfilename.otherextension").to_path_buf(), } } let (tx, rx) = channel(); while let Ok(file_exist) = Watch::new().set_timeout(0.6).single_file(&file,tx.clone()) { if !file_exist { println!("no file to watch"); break; } else { println!("watching... {:?}", file) } for state in &rx { match state { Fstate::Changed(file) => { println!("{:?} changed", file); // do something... } Fstate::NotFound(file) => { // handle something... break; } } } } Ok(()) } ``` ## More Examples Watching Multiple files and live reloading values can be found [here](https://github.com/Ar37-rs/quadoculars/tree/main/example).