extern crate chrono;
extern crate crossbeam_channel;
extern crate crossbeam_utils;
use crossbeam_channel::{select, unbounded, Receiver, Sender};
use log::*;
use notify::event::Event;
use notify::{RecommendedWatcher, RecursiveMode, Watcher};
use std::io::Error;
use std::path::Path;
use super::scheduler::job::JobInfo;
use super::scheduler::Scheduler;
#[allow(clippy::borrowed_box)]
fn check_and_queue(
scheduler: &Box<dyn Scheduler>,
s: &Sender<Box<dyn JobInfo>>,
event: Event,
) -> Result<(), Error> {
debug!("Event received: {:?}", event);
if let Some(paths) = scheduler.verify_event_kind(&event) {
if let Some(jobinfo) = scheduler.create_job_info(&paths[0]) {
debug!("Sending jobinfo");
s.send(jobinfo).unwrap();
}
}
Ok(())
}
#[allow(clippy::borrowed_box)]
pub fn monitor(
scheduler: &Box<dyn Scheduler>,
path: &Path,
s: &Sender<Box<dyn JobInfo>>,
sigchannel: &Receiver<bool>,
) -> notify::Result<()> {
let (tx, rx) = unbounded();
let mut watcher = RecommendedWatcher::new_immediate(move |res| tx.send(res).unwrap())?;
info!("Watching path {:?}", &path);
if let Err(e) = watcher.watch(&path, RecursiveMode::NonRecursive) {
return Err(e);
}
#[allow(clippy::zero_ptr, clippy::drop_copy)]
loop {
select! {
recv(sigchannel) -> b => if let Ok(true) = b {
return Ok(());
},
recv(rx) -> event => {
if let Ok(Ok(e)) = event {
check_and_queue(&scheduler, s, e)?
} else {
error!("Error on received event: {:?}", event);
break;
}
}
}
}
Ok(())
}
#[cfg(test)]
mod tests {}