garbage_code_hunter/language/
mod.rs1pub mod adapter;
2
3use std::path::Path;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7pub enum Language {
8 Rust,
9 C,
10 Cpp,
11 Python,
12 JavaScript,
13 TypeScript,
14 Go,
15 Java,
16 Ruby,
17 Swift,
18 Zig,
19 Unknown,
20}
21
22impl Language {
23 pub fn from_extension(ext: &str) -> Self {
24 match ext {
25 "rs" => Language::Rust,
26 "c" | "h" => Language::C,
27 "cpp" | "cxx" | "cc" | "hpp" | "hh" | "hxx" | "C" | "CPP" => Language::Cpp,
28 "py" => Language::Python,
29 "js" | "mjs" | "cjs" => Language::JavaScript,
30 "ts" | "tsx" | "mts" | "cts" => Language::TypeScript,
31 "go" => Language::Go,
32 "java" => Language::Java,
33 "rb" => Language::Ruby,
34 "swift" => Language::Swift,
35 "zig" => Language::Zig,
36 _ => Language::Unknown,
37 }
38 }
39
40 pub fn from_path(path: &Path) -> Self {
41 path.extension()
42 .and_then(|e| e.to_str())
43 .map(Self::from_extension)
44 .unwrap_or(Language::Unknown)
45 }
46
47 pub fn extensions(&self) -> &'static [&'static str] {
48 match self {
49 Language::Rust => &["rs"],
50 Language::C => &["c", "h"],
51 Language::Cpp => &["cpp", "cxx", "cc", "hpp", "hh", "hxx", "C", "CPP"],
52 Language::Python => &["py"],
53 Language::JavaScript => &["js", "mjs", "cjs"],
54 Language::TypeScript => &["ts", "tsx", "mts", "cts"],
55 Language::Go => &["go"],
56 Language::Java => &["java"],
57 Language::Ruby => &["rb"],
58 Language::Swift => &["swift"],
59 Language::Zig => &["zig"],
60 Language::Unknown => &[],
61 }
62 }
63
64 pub fn display_name(&self) -> &'static str {
65 match self {
66 Language::Rust => "Rust",
67 Language::C => "C",
68 Language::Cpp => "C++",
69 Language::Python => "Python",
70 Language::JavaScript => "JavaScript",
71 Language::TypeScript => "TypeScript",
72 Language::Go => "Go",
73 Language::Java => "Java",
74 Language::Ruby => "Ruby",
75 Language::Swift => "Swift",
76 Language::Zig => "Zig",
77 Language::Unknown => "Unknown",
78 }
79 }
80
81 pub fn line_comment(&self) -> &'static str {
82 match self {
83 Language::Rust
84 | Language::C
85 | Language::Cpp
86 | Language::Go
87 | Language::Java
88 | Language::JavaScript
89 | Language::TypeScript
90 | Language::Ruby
91 | Language::Swift
92 | Language::Zig => "//",
93 Language::Python => "#",
94 Language::Unknown => "//",
95 }
96 }
97
98 pub fn has_tree_sitter_grammar(&self) -> bool {
99 matches!(
100 self,
101 Language::Rust
102 | Language::C
103 | Language::Cpp
104 | Language::Python
105 | Language::JavaScript
106 | Language::TypeScript
107 | Language::Go
108 | Language::Java
109 | Language::Ruby
110 | Language::Swift
111 | Language::Zig
112 )
113 }
114}
115
116pub const LANGUAGES_WITH_GRAMMAR: &[Language] = &[
118 Language::Rust,
119 Language::Python,
120 Language::JavaScript,
121 Language::TypeScript,
122 Language::Go,
123 Language::Java,
124 Language::Ruby,
125 Language::Swift,
126 Language::Zig,
127 Language::C,
128 Language::Cpp,
129];
130
131pub const SUPPORTED_EXTENSIONS: &[&str] = &[
133 "rs", "c", "h", "cpp", "cxx", "cc", "hpp", "hh", "hxx", "C", "CPP", "py", "js", "mjs", "cjs",
134 "ts", "tsx", "mts", "cts", "go", "java", "rb", "swift", "zig",
135];
136
137#[cfg(test)]
138mod tests {
139 use super::*;
140
141 #[test]
142 fn test_from_extension_rust() {
143 assert_eq!(Language::from_extension("rs"), Language::Rust);
144 }
145
146 #[test]
147 fn test_from_extension_python() {
148 assert_eq!(Language::from_extension("py"), Language::Python);
149 }
150
151 #[test]
152 fn test_from_extension_unknown() {
153 assert_eq!(Language::from_extension("xyz"), Language::Unknown);
154 }
155
156 #[test]
157 fn test_extensions_rust() {
158 assert!(Language::Rust.extensions().contains(&"rs"));
159 }
160
161 #[test]
162 fn test_display_names() {
163 assert_eq!(Language::Rust.display_name(), "Rust");
164 assert_eq!(Language::Python.display_name(), "Python");
165 assert_eq!(Language::Unknown.display_name(), "Unknown");
166 }
167
168 #[test]
169 fn test_line_comments() {
170 assert_eq!(Language::Rust.line_comment(), "//");
171 assert_eq!(Language::Python.line_comment(), "#");
172 }
173
174 #[test]
175 fn test_tree_sitter_grammar_available() {
176 assert!(Language::Rust.has_tree_sitter_grammar());
177 assert!(Language::Python.has_tree_sitter_grammar());
178 assert!(!Language::Unknown.has_tree_sitter_grammar());
179 }
180}