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
22pub fn language_from_extension(ext: &str) -> Option<&'static str> {
23 EXTENSION_MAP
24 .iter()
25 .find(|(e, _)| e.eq_ignore_ascii_case(ext))
26 .map(|(_, lang)| *lang)
27}
28
29#[cfg(test)]
30mod tests {
31 use super::*;
32
33 #[test]
34 fn test_language_from_extension_happy_path() {
35 assert_eq!(language_from_extension("rs"), Some("rust"));
36 assert_eq!(language_from_extension("py"), Some("python"));
37 assert_eq!(language_from_extension("go"), Some("go"));
38 assert_eq!(language_from_extension("java"), Some("java"));
39 assert_eq!(language_from_extension("ts"), Some("typescript"));
40 assert_eq!(language_from_extension("tsx"), Some("tsx"));
41 assert_eq!(language_from_extension("f90"), Some("fortran"));
42 assert_eq!(language_from_extension("for"), Some("fortran"));
43 assert_eq!(language_from_extension("ftn"), Some("fortran"));
44 }
45
46 #[test]
47 fn test_language_from_extension_edge_case() {
48 assert_eq!(language_from_extension("unknown"), None);
49 assert_eq!(language_from_extension(""), None);
50 assert_eq!(language_from_extension("RS"), Some("rust"));
51 assert_eq!(language_from_extension("F90"), Some("fortran"));
53 assert_eq!(language_from_extension("FOR"), Some("fortran"));
54 }
55}