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