Skip to main content

code_analyze_mcp/
lang.rs

1//! Language detection by file extension.
2//!
3//! Maps file extensions to supported language identifiers.
4
5const 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        // Uppercase Fortran extensions resolved via eq_ignore_ascii_case
52        assert_eq!(language_from_extension("F90"), Some("fortran"));
53        assert_eq!(language_from_extension("FOR"), Some("fortran"));
54    }
55}