kanshi_rs/
executer.rs

1use std::thread;
2use std::fs;
3use std::time::{Duration, SystemTime};
4use std::sync::Mutex;
5use std::rc::Rc;
6
7use crate::log::{Logger, LogLevel};
8
9pub struct RepeatCacheExecuter<'a> {
10    target_file: &'a String,
11    every: u64,
12    am_updated: Rc<Mutex<Option<SystemTime>>>,
13}
14impl RepeatCacheExecuter<'_> {
15    pub fn new(target_file: &String, every: u64, am_updated: Rc<Mutex<Option<SystemTime>>>) -> RepeatCacheExecuter {
16        RepeatCacheExecuter {
17            target_file,
18            every,
19            am_updated
20        }
21    }
22    pub fn lazy_exec<T>(&mut self, mut closure: T) where T: FnMut() -> () {
23        loop {
24            let meta = fs::metadata(self.target_file).unwrap();
25            let now_timestamp = meta.modified().expect("Error");
26            let mut opt_cached_time = self.am_updated.lock().unwrap();
27            match *opt_cached_time {
28                Some(cached_timestamp) => {
29                    if cached_timestamp.ne(&now_timestamp) {
30                        *opt_cached_time= Some(now_timestamp);
31                        let logger = Logger::new("/var/log/kanshi.log");
32                        logger.write(LogLevel::Info, "File Timestamp is changed now, then execute script!");
33                        closure();
34                    }
35                },
36                None => {
37                    *opt_cached_time = Some(now_timestamp);
38                    let logger = Logger::new("/var/log/kanshi.log");
39                    logger.write(LogLevel::Info, "Start to do monitoring File Timestamp!");
40                    println!("start monitoring!");
41                }
42            }
43            thread::sleep(Duration::from_secs(self.every));
44        }
45    }
46}