alfred_workflow_rust_project/
workflow_cache.rs

1use std::error::Error;
2use std::fs::OpenOptions;
3use std::io::{Read, Write};
4use std::os::unix::raw::pthread_t;
5use std::path::Path;
6use std::time::{Duration, SystemTime};
7use crate::alfred::AlfredEnv;
8use crate::workflow::AlfredWorkflow;
9
10impl AlfredWorkflow {
11    pub fn cache(&mut self, name: &str, data: &str) {
12        let pre_path = self.get_workflow_cache_path();
13        let full_name = format!("{}/{}", pre_path, name);
14
15        // try open cache file
16        let file_rs = OpenOptions::new()
17            .create(true)
18            .write(true)
19            .open(full_name);
20
21        // if open failed
22        // report fatal error
23        if file_rs.is_err() {
24            self.fatal_error("CacheError", file_rs.err().unwrap().description());
25        } else {
26            // write data to cache file
27            let mut file = file_rs.unwrap();
28            let write_rs = file.write(data.as_bytes());
29            if write_rs.is_err() {
30                self.fatal_error("CacheError", write_rs.err().unwrap().description())
31            }
32        }
33    }
34
35    pub fn load(&mut self, name: &str) -> String {
36        let pre_path = self.get_workflow_cache_path();
37        let full_name = format!("{}/{}", pre_path, name);
38
39        let file_rs = OpenOptions::new()
40            .read(true)
41            .open(full_name);
42
43        if file_rs.is_err() {
44            self.fatal_error("CacheError", file_rs.err().unwrap().description());
45            "".to_string()
46        } else {
47            // read data from cache file
48            let mut file = file_rs.unwrap();
49            let mut buf = String::new();
50            let read_rs = file.read_to_string(&mut buf);
51            if read_rs.is_err() {
52                self.fatal_error("CacheError", read_rs.err().unwrap().description());
53            }
54            buf
55        }
56    }
57
58    pub fn expired(&mut self, name: &str, max_age: u64) -> bool {
59        let pre_path = self.get_workflow_cache_path();
60        let full_name = format!("{}/{}", pre_path, name);
61
62        let result = Path::new(full_name.as_str()).metadata();
63        if result.is_err() {
64            self.fatal_error("CacheError", result.err().unwrap().description());
65            return false;
66        } else {
67            let modified = result.unwrap().modified().unwrap();
68            let elapsed = modified.elapsed().unwrap().as_secs();
69            return elapsed > max_age;
70        }
71    }
72}
73
74#[test]
75fn test_is_file_exist() {
76    // let exist = is_file_exist("~/CodeSpace/JIT");
77    // assert_eq!(exist, false);
78
79
80    // let exist = is_file_exist("~/Downloads/gradle-icon2.jpf");
81    // assert_eq!(exist, true);
82
83    let result = Path::new("/Users/christfm/Downloads/gradle-icon2.jpf").metadata();
84    print!("{:?}", result);
85    let result = Path::new("./test").metadata();
86    print!("{:?}", result);
87
88    let mut file = OpenOptions::new()
89        .create(true)
90        .write(true)
91        .append(true)
92        .open("./test")
93        .unwrap();
94
95    file.write("ccc".as_bytes());
96    file.write("ddd".as_bytes());
97    print!("cc")
98}
99
100
101#[test]
102fn test_workflow_cache() {
103    dotenv::dotenv().ok();
104
105    let mut workflow = AlfredWorkflow::init();
106    workflow.cache("test", "just_cache");
107
108    let is_expired = workflow.expired("test", 0);
109    assert_eq!(is_expired, false);
110
111    let content = workflow.load("test");
112    assert_eq!(content, "just_cache".to_string());
113
114    std::thread::sleep(Duration::new(1, 0));
115
116    let is_expired = workflow.expired("test", 0);
117    assert_eq!(is_expired, true);
118}