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    ("rs", "rust"),
7    ("py", "python"),
8    ("go", "go"),
9    ("java", "java"),
10    ("ts", "typescript"),
11    ("tsx", "tsx"),
12];
13
14pub fn language_from_extension(ext: &str) -> Option<&'static str> {
15    EXTENSION_MAP
16        .iter()
17        .find(|(e, _)| e.eq_ignore_ascii_case(ext))
18        .map(|(_, lang)| *lang)
19}
20
21#[cfg(test)]
22mod tests {
23    use super::*;
24
25    #[test]
26    fn test_language_from_extension_happy_path() {
27        assert_eq!(language_from_extension("rs"), Some("rust"));
28        assert_eq!(language_from_extension("py"), Some("python"));
29        assert_eq!(language_from_extension("go"), Some("go"));
30        assert_eq!(language_from_extension("java"), Some("java"));
31        assert_eq!(language_from_extension("ts"), Some("typescript"));
32        assert_eq!(language_from_extension("tsx"), Some("tsx"));
33    }
34
35    #[test]
36    fn test_language_from_extension_edge_case() {
37        assert_eq!(language_from_extension("unknown"), None);
38        assert_eq!(language_from_extension(""), None);
39        assert_eq!(language_from_extension("RS"), Some("rust"));
40    }
41}