Skip to main content

reposcry_graph/
language.rs

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}