Skip to main content

statespace_server/
semantics.rs

1use std::path::Path;
2
3#[must_use]
4pub fn markdown_lookup_candidates(path: &str) -> Vec<String> {
5    let normalized = path.trim_start_matches('/');
6
7    if normalized.is_empty() {
8        return vec!["API.md".to_string()];
9    }
10
11    if normalized.ends_with('/') {
12        return vec![format!("{normalized}README.md")];
13    }
14
15    if Path::new(normalized).extension().is_some() {
16        return vec![normalized.to_string()];
17    }
18
19    vec![
20        normalized.to_string(),
21        format!("{normalized}/README.md"),
22        format!("{normalized}.md"),
23    ]
24}
25
26#[cfg(test)]
27mod tests {
28    use super::*;
29
30    #[test]
31    fn markdown_candidates_for_root() {
32        assert_eq!(markdown_lookup_candidates(""), vec!["API.md"]);
33    }
34
35    #[test]
36    fn markdown_candidates_for_extensionless_path() {
37        assert_eq!(
38            markdown_lookup_candidates("docs/intro"),
39            vec!["docs/intro", "docs/intro/README.md", "docs/intro.md"]
40        );
41    }
42
43    #[test]
44    fn markdown_candidates_for_explicit_markdown_file() {
45        assert_eq!(
46            markdown_lookup_candidates("docs/intro.md"),
47            vec!["docs/intro.md"]
48        );
49    }
50
51    #[test]
52    fn markdown_candidates_for_non_markdown_file() {
53        assert_eq!(
54            markdown_lookup_candidates("data/export.csv"),
55            vec!["data/export.csv"]
56        );
57    }
58
59    #[test]
60    fn markdown_candidates_for_directory_path() {
61        assert_eq!(
62            markdown_lookup_candidates("docs/intro/"),
63            vec!["docs/intro/README.md"]
64        );
65    }
66}