last_update_time/
lib.rs

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    // first, check if this is a normal file etc.
24    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}