1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
4pub enum Language {
5 Rust,
6 TypeScript,
7 JavaScript,
8 Python,
9 Json,
10 Toml,
11 Yaml,
12 Markdown,
13 Css,
14 Html,
15 Sql,
16 Go,
17 Java,
18 CSharp,
19 Cpp,
20 C,
21 Kotlin,
22 Swift,
23 Php,
24 Ruby,
25 Lua,
26 Dart,
27 Scala,
28 Svelte,
29 Vue,
30 Nix,
31 Powershell,
32 Unknown(String),
33}
34
35impl Language {
36 pub fn from_extension(path: &str) -> Self {
37 let ext = path.rsplit('.').next().unwrap_or("").to_lowercase();
38 match ext.as_str() {
39 "rs" => Language::Rust,
40 "ts" | "tsx" => Language::TypeScript,
41 "js" | "jsx" | "mjs" | "cjs" => Language::JavaScript,
42 "py" | "pyw" => Language::Python,
43 "json" => Language::Json,
44 "toml" => Language::Toml,
45 "yaml" | "yml" => Language::Yaml,
46 "md" | "mdx" => Language::Markdown,
47 "css" | "scss" | "sass" | "less" => Language::Css,
48 "html" | "htm" => Language::Html,
49 "sql" => Language::Sql,
50 "go" => Language::Go,
51 "java" => Language::Java,
52 "cs" => Language::CSharp,
53 "cpp" | "cc" | "cxx" | "hpp" | "hh" | "hxx" => Language::Cpp,
54 "c" | "h" => Language::C,
55 "kt" | "kts" => Language::Kotlin,
56 "swift" => Language::Swift,
57 "php" => Language::Php,
58 "rb" => Language::Ruby,
59 "lua" => Language::Lua,
60 "dart" => Language::Dart,
61 "scala" | "sc" => Language::Scala,
62 "svelte" => Language::Svelte,
63 "vue" => Language::Vue,
64 "nix" => Language::Nix,
65 "ps1" | "psm1" | "psd1" => Language::Powershell,
66 _ => Language::Unknown(ext),
67 }
68 }
69
70 pub fn has_tree_sitter_parser(&self) -> bool {
71 matches!(
72 self,
73 Language::Rust
74 | Language::TypeScript
75 | Language::JavaScript
76 | Language::Python
77 | Language::Json
78 | Language::Toml
79 | Language::Yaml
80 )
81 }
82
83 pub fn support_level(&self) -> &'static str {
84 if self.has_tree_sitter_parser() {
85 "symbols-imports-calls"
86 } else {
87 "file-loc-language"
88 }
89 }
90
91 pub fn as_str(&self) -> &'static str {
92 match self {
93 Language::Rust => "rust",
94 Language::TypeScript => "typescript",
95 Language::JavaScript => "javascript",
96 Language::Python => "python",
97 Language::Json => "json",
98 Language::Toml => "toml",
99 Language::Yaml => "yaml",
100 Language::Markdown => "markdown",
101 Language::Css => "css",
102 Language::Html => "html",
103 Language::Sql => "sql",
104 Language::Go => "go",
105 Language::Java => "java",
106 Language::CSharp => "csharp",
107 Language::Cpp => "cpp",
108 Language::C => "c",
109 Language::Kotlin => "kotlin",
110 Language::Swift => "swift",
111 Language::Php => "php",
112 Language::Ruby => "ruby",
113 Language::Lua => "lua",
114 Language::Dart => "dart",
115 Language::Scala => "scala",
116 Language::Svelte => "svelte",
117 Language::Vue => "vue",
118 Language::Nix => "nix",
119 Language::Powershell => "powershell",
120 Language::Unknown(_) => "unknown",
121 }
122 }
123}