use serde::{Deserialize, Serialize};
use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Language {
Rust,
Python,
JavaScript,
TypeScript,
Go,
Unknown,
}
impl Language {
pub fn from_extension(ext: &str) -> Self {
match ext {
"rs" => Self::Rust,
"py" => Self::Python,
"js" | "mjs" | "cjs" | "jsx" => Self::JavaScript,
"ts" | "tsx" => Self::TypeScript,
"go" => Self::Go,
_ => Self::Unknown,
}
}
pub fn from_path(path: &std::path::Path) -> Self {
path.extension()
.and_then(|e| e.to_str())
.map(Self::from_extension)
.unwrap_or(Self::Unknown)
}
}
impl fmt::Display for Language {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let s = match self {
Self::Rust => "rust",
Self::Python => "python",
Self::JavaScript => "javascript",
Self::TypeScript => "typescript",
Self::Go => "go",
Self::Unknown => "unknown",
};
write!(f, "{s}")
}
}