1const EXTENSION_MAP: &[(&str, &str)] = &[
6 ("f", "fortran"),
7 ("f03", "fortran"),
8 ("f08", "fortran"),
9 ("f77", "fortran"),
10 ("f90", "fortran"),
11 ("f95", "fortran"),
12 ("for", "fortran"),
13 ("ftn", "fortran"),
14 ("go", "go"),
15 ("java", "java"),
16 ("py", "python"),
17 ("rs", "rust"),
18 ("ts", "typescript"),
19 ("tsx", "tsx"),
20];
21
22#[must_use]
27pub fn language_from_extension(ext: &str) -> Option<&'static str> {
28 EXTENSION_MAP
29 .iter()
30 .find(|(e, _)| e.eq_ignore_ascii_case(ext))
31 .map(|(_, lang)| *lang)
32}
33
34#[cfg(test)]
35mod tests {
36 use super::*;
37
38 #[test]
39 fn test_language_from_extension_happy_path() {
40 assert_eq!(language_from_extension("rs"), Some("rust"));
41 assert_eq!(language_from_extension("py"), Some("python"));
42 assert_eq!(language_from_extension("go"), Some("go"));
43 assert_eq!(language_from_extension("java"), Some("java"));
44 assert_eq!(language_from_extension("ts"), Some("typescript"));
45 assert_eq!(language_from_extension("tsx"), Some("tsx"));
46 assert_eq!(language_from_extension("f90"), Some("fortran"));
47 assert_eq!(language_from_extension("for"), Some("fortran"));
48 assert_eq!(language_from_extension("ftn"), Some("fortran"));
49 }
50
51 #[test]
52 fn test_language_from_extension_edge_case() {
53 assert_eq!(language_from_extension("unknown"), None);
54 assert_eq!(language_from_extension(""), None);
55 assert_eq!(language_from_extension("RS"), Some("rust"));
56 assert_eq!(language_from_extension("F90"), Some("fortran"));
58 assert_eq!(language_from_extension("FOR"), Some("fortran"));
59 }
60}