use std::hash::Hash;
#[allow(unused_imports)]
pub use std::str::FromStr as _;
use serde::{Deserialize, Serialize};
#[derive(
Debug,
PartialEq,
Eq,
Clone,
Copy,
Deserialize,
Serialize,
strum_macros::EnumString,
strum_macros::Display,
strum_macros::EnumIter,
strum_macros::AsRefStr,
)]
#[strum(ascii_case_insensitive)]
#[non_exhaustive]
pub enum SupportedLanguages {
#[serde(alias = "rust")]
Rust,
#[serde(alias = "typescript")]
Typescript,
#[serde(alias = "python")]
Python,
#[serde(alias = "ruby")]
Ruby,
#[serde(alias = "javascript")]
Javascript,
#[serde(alias = "java")]
Java,
#[serde(alias = "go")]
Go,
#[serde(rename = "c-sharp", alias = "csharp", alias = "c#", alias = "C#")]
#[strum(
serialize = "csharp",
serialize = "c-sharp",
serialize = "c#",
serialize = "C#",
to_string = "c-sharp"
)]
CSharp,
#[serde(alias = "solidity")]
Solidity,
#[serde(alias = "c")]
C,
#[serde(alias = "cpp", alias = "c++", alias = "C++", rename = "C++")]
#[strum(
serialize = "c++",
serialize = "cpp",
serialize = "Cpp",
to_string = "C++"
)]
Cpp,
#[serde(alias = "elixir")]
Elixir,
#[serde(alias = "html", alias = "Html")]
HTML,
#[serde(alias = "php", alias = "PHP", alias = "Php")]
PHP,
}
impl Hash for SupportedLanguages {
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
self.as_ref().hash(state);
}
}
static RUST_EXTENSIONS: &[&str] = &["rs"];
static TYPESCRIPT_EXTENSIONS: &[&str] = &["ts", "tsx", "js", "jsx"];
static PYTHON_EXTENSIONS: &[&str] = &["py"];
static RUBY_EXTENSIONS: &[&str] = &["rb"];
static JAVASCRIPT_EXTENSIONS: &[&str] = &["js", "jsx"];
static JAVA_EXTENSIONS: &[&str] = &["java"];
static GO_EXTENSIONS: &[&str] = &["go"];
static C_SHARP_EXTENSIONS: &[&str] = &["cs", "csx"];
static SOLIDITY_EXTENSIONS: &[&str] = &["sol"];
static C_EXTENSIONS: &[&str] = &["c", "h", "o"];
static CPP_EXTENSIONS: &[&str] = &["c", "h", "o", "cc", "cpp"];
static ELIXIR_EXTENSIONS: &[&str] = &["ex", "exs"];
static HTML_EXTENSIONS: &[&str] = &["html", "htm", "xhtml"];
static PHP_EXTENSIONS: &[&str] = &["php"];
impl SupportedLanguages {
pub fn file_extensions(&self) -> &[&str] {
match self {
SupportedLanguages::Rust => RUST_EXTENSIONS,
SupportedLanguages::Typescript => TYPESCRIPT_EXTENSIONS,
SupportedLanguages::Python => PYTHON_EXTENSIONS,
SupportedLanguages::Ruby => RUBY_EXTENSIONS,
SupportedLanguages::Javascript => JAVASCRIPT_EXTENSIONS,
SupportedLanguages::Java => JAVA_EXTENSIONS,
SupportedLanguages::Go => GO_EXTENSIONS,
SupportedLanguages::CSharp => C_SHARP_EXTENSIONS,
SupportedLanguages::Solidity => SOLIDITY_EXTENSIONS,
SupportedLanguages::C => C_EXTENSIONS,
SupportedLanguages::Cpp => CPP_EXTENSIONS,
SupportedLanguages::Elixir => ELIXIR_EXTENSIONS,
SupportedLanguages::HTML => HTML_EXTENSIONS,
SupportedLanguages::PHP => PHP_EXTENSIONS,
}
}
}
impl From<SupportedLanguages> for tree_sitter::Language {
fn from(val: SupportedLanguages) -> Self {
match val {
SupportedLanguages::Rust => tree_sitter_rust::LANGUAGE,
SupportedLanguages::Python => tree_sitter_python::LANGUAGE,
SupportedLanguages::Typescript => tree_sitter_typescript::LANGUAGE_TYPESCRIPT,
SupportedLanguages::Javascript => tree_sitter_javascript::LANGUAGE,
SupportedLanguages::Ruby => tree_sitter_ruby::LANGUAGE,
SupportedLanguages::Java => tree_sitter_java::LANGUAGE,
SupportedLanguages::Go => tree_sitter_go::LANGUAGE,
SupportedLanguages::CSharp => tree_sitter_c_sharp::LANGUAGE,
SupportedLanguages::Solidity => tree_sitter_solidity::LANGUAGE,
SupportedLanguages::C => tree_sitter_c::LANGUAGE,
SupportedLanguages::Cpp => tree_sitter_cpp::LANGUAGE,
SupportedLanguages::Elixir => tree_sitter_elixir::LANGUAGE,
SupportedLanguages::HTML => tree_sitter_html::LANGUAGE,
SupportedLanguages::PHP => tree_sitter_php::LANGUAGE_PHP,
}
.into()
}
}
#[cfg(test)]
mod test {
use super::*;
pub use strum::IntoEnumIterator as _;
#[test]
fn test_supported_languages_from_str() {
assert_eq!(
SupportedLanguages::from_str("rust"),
Ok(SupportedLanguages::Rust)
);
assert_eq!(
SupportedLanguages::from_str("typescript"),
Ok(SupportedLanguages::Typescript)
);
assert_eq!(
SupportedLanguages::from_str("java"),
Ok(SupportedLanguages::Java)
);
assert_eq!(
SupportedLanguages::from_str("c-sharp"),
Ok(SupportedLanguages::CSharp)
);
}
#[test]
fn test_supported_languages_from_str_case_insensitive() {
assert_eq!(
SupportedLanguages::from_str("Rust"),
Ok(SupportedLanguages::Rust)
);
assert_eq!(
SupportedLanguages::from_str("TypeScript"),
Ok(SupportedLanguages::Typescript)
);
assert_eq!(
SupportedLanguages::from_str("Java"),
Ok(SupportedLanguages::Java)
);
assert_eq!(
SupportedLanguages::from_str("C-Sharp"),
Ok(SupportedLanguages::CSharp)
);
assert_eq!(
SupportedLanguages::from_str("C++"),
Ok(SupportedLanguages::Cpp)
);
assert_eq!(
SupportedLanguages::from_str("cpp"),
Ok(SupportedLanguages::Cpp)
);
assert_eq!(
SupportedLanguages::from_str("elixir"),
Ok(SupportedLanguages::Elixir)
);
}
#[test]
fn test_serialize_and_deserialize_for_supported_languages() {
for lang in SupportedLanguages::iter() {
let val = serde_json::to_string(&lang).unwrap();
assert_eq!(
serde_json::to_string(&lang).unwrap(),
format!("\"{lang}\""),
"Failed to serialize {lang}"
);
assert_eq!(
serde_json::from_str::<SupportedLanguages>(&val).unwrap(),
lang,
"Failed to deserialize {lang}"
);
assert_eq!(
serde_json::from_str::<SupportedLanguages>(&val.to_lowercase()).unwrap(),
lang,
"Failed to deserialize lowercase {lang}"
);
}
}
}