ddoc/
statics.rs

1use {
2    crate::*,
3    std::{
4        fs,
5        path::Path,
6        time::SystemTime,
7    },
8};
9
10/// Implicit reference to one of the files in `/src/js` or `/src/css`
11pub struct StaticEntry {
12    pub filename: String,
13    pub mtime: u64, // secs since UNIX_EPOCH
14}
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}