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
22/// Returns the language identifier for the given file extension, or `None` if unsupported.
23///
24/// The lookup is case-insensitive. Supported extensions include `rs`, `py`, `go`, `java`,
25/// `ts`, `tsx`, `f90`, `f95`, `for`, `ftn`, and other Fortran variants.
26pub 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        // Uppercase Fortran extensions resolved via eq_ignore_ascii_case
56        assert_eq!(language_from_extension("F90"), Some("fortran"));
57        assert_eq!(language_from_extension("FOR"), Some("fortran"));
58    }
59}