extern crate notify;
use notify::op::CREATE;
use notify::{RecommendedWatcher, Watcher};
use std::path::Path;
use std::sync::mpsc::channel;
#[cfg(target_os="linux")]
fn add_watch<P: AsRef<Path>>(watcher: &mut RecommendedWatcher, path: P) -> notify::Result<()> {
watcher.watch(path)
}
#[cfg(not(target_os="linux"))]
fn add_watch<P: AsRef<Path>>(watcher: &mut RecommendedWatcher, path: P) -> notify::Result<()> {
Ok(())
}
fn watch<P: AsRef<Path>>(path: P) -> notify::Result<()> {
let (tx, rx) = channel();
let mut watcher: RecommendedWatcher = try!(Watcher::new(tx));
try!(watcher.watch(path));
loop {
match rx.recv() {
Ok(notify::Event{path:Some(path), op:Ok(CREATE)}) => {
println!("{:?} {:?}", CREATE, path);
if path.is_dir() {
if let Err(e) = add_watch(&mut watcher, path) {
println!("error adding watch {}", e);
}
}
},
Ok(notify::Event{path:Some(path), op:Ok(op)}) => {
println!("{:?} {:?}", op, path);
},
Err(e) => println!("watch error {}", e),
_ => ()
}
}
}
fn main() {
let path = std::env::args().nth(1).unwrap();
println!("watching {}", path);
if let Err(err) = watch(path) {
println!("Error!: {:?}", err)
}
}