Skip to main content

git_topology/chunking/
languages.rs

1use tree_sitter::Language;
2
3#[derive(Debug, Clone, Copy)]
4pub enum SupportedLanguage {
5    Rust,
6    Python,
7    JavaScript,
8    TypeScript,
9    Java,
10    C,
11    Cpp,
12    Go,
13}
14
15impl SupportedLanguage {
16    pub fn tree_sitter_language(&self) -> Language {
17        match self {
18            SupportedLanguage::Rust => tree_sitter_rust::LANGUAGE.into(),
19            SupportedLanguage::Python => tree_sitter_python::LANGUAGE.into(),
20            SupportedLanguage::JavaScript => tree_sitter_javascript::LANGUAGE.into(),
21            SupportedLanguage::TypeScript => tree_sitter_typescript::LANGUAGE_TYPESCRIPT.into(),
22            SupportedLanguage::Java => tree_sitter_java::LANGUAGE.into(),
23            SupportedLanguage::C => tree_sitter_c::LANGUAGE.into(),
24            SupportedLanguage::Cpp => tree_sitter_cpp::LANGUAGE.into(),
25            SupportedLanguage::Go => tree_sitter_go::LANGUAGE.into(),
26        }
27    }
28}
29
30pub fn detect_language(file_path: &str) -> Option<SupportedLanguage> {
31    let extension = file_path.split('.').next_back()?.to_lowercase();
32    match extension.as_str() {
33        "rs" => Some(SupportedLanguage::Rust),
34        "py" | "pyw" | "pyi" => Some(SupportedLanguage::Python),
35        "js" | "mjs" | "cjs" => Some(SupportedLanguage::JavaScript),
36        "ts" | "tsx" => Some(SupportedLanguage::TypeScript),
37        "java" => Some(SupportedLanguage::Java),
38        "c" | "h" => Some(SupportedLanguage::C),
39        "cpp" | "cc" | "cxx" | "hpp" | "hxx" => Some(SupportedLanguage::Cpp),
40        "go" => Some(SupportedLanguage::Go),
41        _ => None,
42    }
43}
44
45#[cfg(test)]
46mod tests {
47    use super::*;
48
49    #[test]
50    fn detects_rust() {
51        assert!(matches!(
52            detect_language("src/main.rs"),
53            Some(SupportedLanguage::Rust)
54        ));
55    }
56
57    #[test]
58    fn detects_python_variants() {
59        assert!(matches!(
60            detect_language("script.py"),
61            Some(SupportedLanguage::Python)
62        ));
63        assert!(matches!(
64            detect_language("types.pyi"),
65            Some(SupportedLanguage::Python)
66        ));
67    }
68
69    #[test]
70    fn detects_typescript() {
71        assert!(matches!(
72            detect_language("app.ts"),
73            Some(SupportedLanguage::TypeScript)
74        ));
75        assert!(matches!(
76            detect_language("comp.tsx"),
77            Some(SupportedLanguage::TypeScript)
78        ));
79    }
80
81    #[test]
82    fn detects_go() {
83        assert!(matches!(
84            detect_language("main.go"),
85            Some(SupportedLanguage::Go)
86        ));
87    }
88
89    #[test]
90    fn unsupported_returns_none() {
91        assert!(detect_language("README.md").is_none());
92        assert!(detect_language("data.json").is_none());
93        assert!(detect_language("Makefile").is_none());
94    }
95
96    #[test]
97    fn case_insensitive_extension() {
98        assert!(detect_language("main.RS").is_some());
99        assert!(detect_language("script.PY").is_some());
100    }
101}