use crate::color::Color;
use std::path::Path;
#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum Languages {
Cpp,
C,
Cmake,
Make,
Ninja,
Gradle,
Maven,
Python,
Java,
Javascript,
Typescript,
Go,
Rust,
Ruby,
Php,
Shell,
Lua,
R,
Swift,
Kotlin,
Fsharp,
FsharpScript,
Csharp,
VisualBasic,
Assembly,
Json,
Yaml,
Toml,
Xml,
}
impl Languages {
pub const ALL: [Languages; 29] = [
Self::Cpp,
Self::C,
Self::Cmake,
Self::Make,
Self::Ninja,
Self::Gradle,
Self::Maven,
Self::Python,
Self::Java,
Self::Javascript,
Self::Typescript,
Self::Go,
Self::Rust,
Self::Ruby,
Self::Php,
Self::Shell,
Self::Lua,
Self::R,
Self::Swift,
Self::Kotlin,
Self::Fsharp,
Self::FsharpScript,
Self::Csharp,
Self::VisualBasic,
Self::Assembly,
Self::Json,
Self::Yaml,
Self::Toml,
Self::Xml,
];
pub const COUNT: usize = Self::ALL.len();
const EXACT_FILENAMES: &[(&str, Self)] = &[
("CMakeLists.txt", Self::Cmake),
("Makefile", Self::Make),
("pom.xml", Self::Maven),
("build.gradle", Self::Gradle),
];
pub fn from_path(path: &Path) -> Option<Self> {
let file_name = path.file_name()?.to_str()?;
for (name, lang) in Self::EXACT_FILENAMES {
if file_name == *name {
return Some(*lang);
}
}
let ext = path.extension()?.to_str()?;
Some(match ext {
"c" | "h" => Self::C,
"cpp" | "hpp" | "cxx" | "cc" | "hxx" | "hh" | "inl" => Self::Cpp,
"cmake" => Self::Cmake,
"mk" => Self::Make,
"ninja" => Self::Ninja,
"gradle" => Self::Gradle,
"py" | "pyw" | "pyi" => Self::Python,
"java" => Self::Java,
"js" | "mjs" | "cjs" => Self::Javascript,
"ts" | "tsx" => Self::Typescript,
"go" => Self::Go,
"rs" => Self::Rust,
"rb" | "rake" | "gemspec" => Self::Ruby,
"php" | "phtml" => Self::Php,
"sh" | "bash" | "zsh" => Self::Shell,
"lua" => Self::Lua,
"R" | "r" => Self::R,
"swift" => Self::Swift,
"kt" | "kts" => Self::Kotlin,
"fs" | "fsi" => Self::Fsharp,
"fsx" => Self::FsharpScript,
"cs" => Self::Csharp,
"vb" => Self::VisualBasic,
"s" | "asm" => Self::Assembly,
"json" => Self::Json,
"yaml" | "yml" => Self::Yaml,
"toml" => Self::Toml,
"xml" => Self::Xml,
_ => return None,
})
}
pub const fn idx(self) -> usize {
self as usize
}
pub const fn to_str(self) -> &'static str {
match self {
Languages::Cpp => "Cpp",
Languages::C => "C",
Languages::Cmake => "CMake",
Languages::Make => "Make",
Languages::Ninja => "Ninja",
Languages::Gradle => "Gradle",
Languages::Maven => "Maven",
Languages::Python => "Python",
Languages::Java => "Java",
Languages::Javascript => "JavaScript",
Languages::Typescript => "TypeScript",
Languages::Go => "Go",
Languages::Rust => "Rust",
Languages::Ruby => "Ruby",
Languages::Php => "PHP",
Languages::Shell => "Shell",
Languages::Lua => "Lua",
Languages::R => "R",
Languages::Swift => "Swift",
Languages::Kotlin => "Kotlin",
Languages::Fsharp => "FSharp",
Languages::FsharpScript => "FSharpScript",
Languages::Csharp => "CSharp",
Languages::VisualBasic => "VisualBasic",
Languages::Assembly => "Assembly",
Languages::Json => "JSON",
Languages::Yaml => "YAML",
Languages::Toml => "TOML",
Languages::Xml => "XML",
}
}
pub const fn to_rgb(self) -> Color {
match self {
Languages::C => Color::new(85, 85, 85),
Languages::Cpp => Color::new(243, 75, 125),
Languages::Cmake => Color::new(218, 52, 52),
Languages::Make => Color::new(66, 120, 25),
Languages::Ninja => Color::new(128, 0, 255),
Languages::Gradle => Color::new(2, 48, 58),
Languages::Maven => Color::new(199, 26, 54),
Languages::Python => Color::new(53, 114, 165),
Languages::Java => Color::new(176, 114, 25),
Languages::Javascript => Color::new(241, 224, 90),
Languages::Typescript => Color::new(49, 120, 198),
Languages::Go => Color::new(0, 173, 216),
Languages::Rust => Color::new(222, 165, 132),
Languages::Ruby => Color::new(112, 21, 22),
Languages::Php => Color::new(79, 93, 149),
Languages::Shell => Color::new(137, 224, 81),
Languages::Lua => Color::new(0, 0, 128),
Languages::R => Color::new(25, 140, 231),
Languages::Swift => Color::new(240, 81, 56),
Languages::Kotlin => Color::new(169, 123, 255),
Languages::Fsharp => Color::new(184, 69, 252),
Languages::FsharpScript => Color::new(184, 69, 252),
Languages::Csharp => Color::new(23, 134, 0),
Languages::VisualBasic => Color::new(148, 93, 183),
Languages::Assembly => Color::new(110, 76, 19),
Languages::Json => Color::new(139, 148, 158),
Languages::Yaml => Color::new(203, 23, 30),
Languages::Toml => Color::new(156, 66, 33),
Languages::Xml => Color::new(0, 96, 172),
}
}
}