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}