#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Tier1Language {
Rust,
Python,
Java,
JavaScript,
TypeScript,
Tsx,
}
impl Tier1Language {
#[must_use]
pub fn from_path(path: &str) -> Option<Self> {
let ext = path.rsplit('.').next()?;
match ext.to_ascii_lowercase().as_str() {
"rs" => Some(Self::Rust),
"py" | "pyi" => Some(Self::Python),
"java" => Some(Self::Java),
"js" | "jsx" | "mjs" | "cjs" => Some(Self::JavaScript),
"ts" => Some(Self::TypeScript),
"tsx" => Some(Self::Tsx),
_ => None,
}
}
#[must_use]
pub fn as_str(self) -> &'static str {
match self {
Self::Rust => "rust",
Self::Python => "python",
Self::Java => "java",
Self::JavaScript => "javascript",
Self::TypeScript | Self::Tsx => "typescript",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn tsx_and_ts_dispatch_to_distinct_variants() {
assert_eq!(
Tier1Language::from_path("View.tsx"),
Some(Tier1Language::Tsx)
);
assert_eq!(
Tier1Language::from_path("app.ts"),
Some(Tier1Language::TypeScript)
);
}
#[test]
fn tsx_reports_the_typescript_label() {
assert_eq!(Tier1Language::Tsx.as_str(), "typescript");
assert_eq!(Tier1Language::TypeScript.as_str(), "typescript");
}
}