1use std::fs::read_dir;
2use std::io;
3use std::path::Path;
4use std::time::SystemTime;
5
6#[cfg(test)]
7mod tests {
8 use crate::last_update_time;
9
10 #[test]
11 fn file() {
12 let result = last_update_time("./src/lib.rs");
13 assert!(result.is_ok());
14 }
15 #[test]
16 fn dir() {
17 let result = last_update_time(".");
18 assert!(result.is_ok());
19 }
20}
21
22pub fn last_update_time(path: &str) -> io::Result<SystemTime> {
23 let mut largest_time = {
25 let path = Path::new(path);
26 let m = path.metadata()?;
27 let time = m.modified()?;
28
29 if !m.is_dir() {
30 return Ok(time);
31 }
32 time
33 };
34
35 for entry in read_dir(path)? {
36 if entry.is_err() {
37 continue;
38 }
39 let entry = entry.unwrap();
40
41 let m = entry.metadata();
42 if m.is_err() {
43 continue;
44 }
45 let m = m.unwrap();
46
47 let mut time = m.modified()?;
48
49 if m.is_dir() {
50 let path = entry.path();
51 let path = path.to_str().unwrap();
52 if let Ok(subtime) = last_update_time(path) {
53 if subtime > time {
54 time = subtime;
55 }
56 }
57 }
58
59 if time > largest_time {
60 largest_time = time;
61 }
62 }
63
64 Ok(largest_time)
65}