use std::path::Path;
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum Language {
Rust,
JavaScript,
Jsx,
TypeScript,
Tsx,
Python,
Java,
Kotlin,
Vue,
Svelte,
Go,
}
impl Language {
pub fn from_path(path: &Path) -> Option<Language> {
let ext = path.extension()?.to_str()?.to_ascii_lowercase();
Some(match ext.as_str() {
"rs" => Language::Rust,
"js" | "mjs" | "cjs" => Language::JavaScript,
"jsx" => Language::Jsx,
"ts" | "mts" | "cts" => Language::TypeScript,
"tsx" => Language::Tsx,
"py" | "pyi" => Language::Python,
"java" => Language::Java,
"kt" | "kts" => Language::Kotlin,
"vue" => Language::Vue,
"svelte" => Language::Svelte,
"go" => Language::Go,
_ => return None,
})
}
pub fn group(&self) -> &'static str {
match self {
Language::Rust => "rust",
Language::JavaScript | Language::Jsx => "javascript",
Language::TypeScript | Language::Tsx => "typescript",
Language::Python => "python",
Language::Java => "java",
Language::Kotlin => "kotlin",
Language::Vue => "vue",
Language::Svelte => "svelte",
Language::Go => "go",
}
}
pub fn is_supported(&self) -> bool {
true
}
pub fn matches_filter(&self, token: &str) -> bool {
let t = token.trim().to_ascii_lowercase();
match t.as_str() {
"js" => self.group() == "javascript",
"ts" => self.group() == "typescript",
"py" => self.group() == "python",
"kt" => self.group() == "kotlin",
"vue" => self.group() == "vue",
"svelte" => self.group() == "svelte",
other => other == self.group(),
}
}
}