statespace_server/
semantics.rs1use 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}