1use {
2 crate::*,
3 std::{
4 fs,
5 path::Path,
6 time::SystemTime,
7 },
8};
9
10pub struct StaticEntry {
12 pub filename: String,
13 pub mtime: u64, }
15
16impl StaticEntry {
17 pub fn list_in(
18 dir: &Path,
19 ext_filter: Option<&str>,
20 ) -> DdResult<Vec<Self>> {
21 let mut entries = Vec::new();
22 if dir.exists() {
23 for entry in fs::read_dir(dir)? {
24 let entry = entry?;
25 let file_type = entry.file_type()?;
26 if !file_type.is_file() {
27 continue;
28 }
29 let file_name = entry.file_name();
30 let Some(file_name) = file_name.to_str() else {
31 continue;
32 };
33 if file_name.starts_with('.') {
34 continue;
35 }
36 if let Some(ext) = ext_filter {
37 if !file_name.ends_with(ext) {
38 continue;
39 }
40 }
41 let Some(mtime) = entry.metadata().and_then(|m| m.modified()).ok() else {
42 continue;
43 };
44 let mtime = mtime
45 .duration_since(SystemTime::UNIX_EPOCH)
46 .unwrap_or_default()
47 .as_secs();
48 entries.push(Self {
49 filename: file_name.to_string(),
50 mtime,
51 });
52 }
53 entries.sort_by(|a, b| a.filename.cmp(&b.filename));
54 }
55 Ok(entries)
56 }
57}