#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Language {
Rust,
TypeScript,
Python,
JavaScript,
Markdown,
Json,
Yaml,
Toml,
Csv,
}
impl std::fmt::Display for Language {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Rust => write!(f, "rust"),
Self::TypeScript => write!(f, "typescript"),
Self::Python => write!(f, "python"),
Self::JavaScript => write!(f, "javascript"),
Self::Markdown => write!(f, "markdown"),
Self::Json => write!(f, "json"),
Self::Yaml => write!(f, "yaml"),
Self::Toml => write!(f, "toml"),
Self::Csv => write!(f, "csv"),
}
}
}
impl Language {
pub fn from_extension(ext: &str) -> Option<Self> {
match ext {
"rs" => Some(Self::Rust),
"ts" => Some(Self::TypeScript),
"tsx" => Some(Self::TypeScript),
"js" => Some(Self::JavaScript),
"jsx" => Some(Self::JavaScript),
"py" => Some(Self::Python),
"md" => Some(Self::Markdown),
"json" => Some(Self::Json),
"yaml" | "yml" => Some(Self::Yaml),
"toml" => Some(Self::Toml),
"csv" => Some(Self::Csv),
_ => None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn known_extensions() {
assert_eq!(Language::from_extension("rs"), Some(Language::Rust));
assert_eq!(Language::from_extension("ts"), Some(Language::TypeScript));
assert_eq!(Language::from_extension("tsx"), Some(Language::TypeScript));
assert_eq!(Language::from_extension("js"), Some(Language::JavaScript));
assert_eq!(Language::from_extension("jsx"), Some(Language::JavaScript));
assert_eq!(Language::from_extension("py"), Some(Language::Python));
assert_eq!(Language::from_extension("md"), Some(Language::Markdown));
assert_eq!(Language::from_extension("json"), Some(Language::Json));
assert_eq!(Language::from_extension("yaml"), Some(Language::Yaml));
assert_eq!(Language::from_extension("yml"), Some(Language::Yaml));
assert_eq!(Language::from_extension("toml"), Some(Language::Toml));
assert_eq!(Language::from_extension("csv"), Some(Language::Csv));
}
#[test]
fn unknown_extension() {
assert_eq!(Language::from_extension("png"), None);
assert_eq!(Language::from_extension(""), None);
}
}