alfred_workflow_rust_project/
workflow_cache.rs1use 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 let file_rs = OpenOptions::new()
17 .create(true)
18 .write(true)
19 .open(full_name);
20
21 if file_rs.is_err() {
24 self.fatal_error("CacheError", file_rs.err().unwrap().description());
25 } else {
26 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 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 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}