git_topology/chunking/
languages.rs1use 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}