use serde::{Deserialize, Serialize};
#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum FileType {
Rust,
C,
Cpp,
CSharp,
Java,
Python,
JavaScript,
TypeScript,
Go,
Ruby,
PHP,
Swift,
Kotlin,
Scala,
Lua,
Perl,
Haskell,
Shell,
Bash,
PowerShell,
ObjectiveC,
Dart,
Html,
Css,
Xml,
Json,
Yaml,
Toml,
Markdown,
Latex,
Sql,
Csv,
Ini,
Dockerfile,
Makefile,
Gradle,
Maven,
Gitignore,
EditorConfig,
TextPlain,
Binary,
#[serde(other)]
Unknown,
}
impl Default for FileType {
fn default() -> Self {
Self::Unknown
}
}
impl From<&str> for FileType {
fn from(s: &str) -> Self {
match s.to_lowercase().as_str() {
"rust" => FileType::Rust,
"c" => FileType::C,
"cpp" => FileType::Cpp,
"csharp" | "cs" => FileType::CSharp,
"java" => FileType::Java,
"python" => FileType::Python,
"javascript" | "js" => FileType::JavaScript,
"typescript" | "ts" => FileType::TypeScript,
"go" => FileType::Go,
"ruby" => FileType::Ruby,
"php" => FileType::PHP,
"swift" => FileType::Swift,
"kotlin" => FileType::Kotlin,
"scala" => FileType::Scala,
"lua" => FileType::Lua,
"perl" => FileType::Perl,
"haskell" => FileType::Haskell,
"shell" | "sh" => FileType::Shell,
"bash" => FileType::Bash,
"powershell" | "ps1" => FileType::PowerShell,
"objective-c" | "objc" => FileType::ObjectiveC,
"dart" => FileType::Dart,
"html" => FileType::Html,
"css" => FileType::Css,
"xml" => FileType::Xml,
"json" => FileType::Json,
"yaml" | "yml" => FileType::Yaml,
"toml" => FileType::Toml,
"markdown" | "md" => FileType::Markdown,
"latex" | "tex" => FileType::Latex,
"sql" => FileType::Sql,
"csv" => FileType::Csv,
"ini" => FileType::Ini,
"dockerfile" => FileType::Dockerfile,
"makefile" => FileType::Makefile,
"gradle" => FileType::Gradle,
"maven" => FileType::Maven,
"gitignore" => FileType::Gitignore,
"editorconfig" => FileType::EditorConfig,
"text" | "plain" | "txt" => FileType::TextPlain,
"binary" | "bin" => FileType::Binary,
_ => FileType::Unknown,
}
}
}
impl std::fmt::Display for FileType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", self)
}
}
impl FileType {
pub fn extension(&self) -> &'static str {
match self {
FileType::Rust => "rs",
FileType::C => "c",
FileType::Cpp => "cpp",
FileType::CSharp => "cs",
FileType::Java => "java",
FileType::Python => "py",
FileType::JavaScript => "js",
FileType::TypeScript => "ts",
FileType::Go => "go",
FileType::Ruby => "rb",
FileType::PHP => "php",
FileType::Swift => "swift",
FileType::Kotlin => "kt",
FileType::Scala => "scala",
FileType::Lua => "lua",
FileType::Perl => "pl",
FileType::Haskell => "hs",
FileType::Shell => "sh",
FileType::Bash => "bash",
FileType::PowerShell => "ps1",
FileType::ObjectiveC => "m",
FileType::Dart => "dart",
FileType::Html => "html",
FileType::Css => "css",
FileType::Xml => "xml",
FileType::Json => "json",
FileType::Yaml => "yaml",
FileType::Toml => "toml",
FileType::Markdown => "md",
FileType::Latex => "tex",
FileType::Sql => "sql",
FileType::Csv => "csv",
FileType::Ini => "ini",
FileType::Dockerfile => "dockerfile",
FileType::Makefile => "makefile",
FileType::Gradle => "gradle",
FileType::Maven => "pom.xml",
FileType::Gitignore => "gitignore",
FileType::EditorConfig => "editorconfig",
FileType::TextPlain => "txt",
#[cfg(windows)]
FileType::Binary => "exe",
#[cfg(unix)]
FileType::Binary => "",
FileType::Unknown => "",
}
}
pub fn from_extension(ext: &str) -> Self {
let ext = ext.trim_start_matches('.').to_lowercase();
match ext.as_str() {
"rs" => FileType::Rust,
"c" => FileType::C,
"cpp" => FileType::Cpp,
"cs" => FileType::CSharp,
"java" => FileType::Java,
"py" => FileType::Python,
"js" => FileType::JavaScript,
"ts" => FileType::TypeScript,
"go" => FileType::Go,
"rb" => FileType::Ruby,
"php" => FileType::PHP,
"swift" => FileType::Swift,
"kt" => FileType::Kotlin,
"scala" => FileType::Scala,
"lua" => FileType::Lua,
"pl" => FileType::Perl,
"hs" => FileType::Haskell,
"sh" => FileType::Shell,
"bash" => FileType::Bash,
"ps1" => FileType::PowerShell,
"m" => FileType::ObjectiveC,
"dart" => FileType::Dart,
"html" => FileType::Html,
"css" => FileType::Css,
"xml" => FileType::Xml,
"json" => FileType::Json,
"yaml" | "yml" => FileType::Yaml,
"toml" => FileType::Toml,
"md" => FileType::Markdown,
"tex" => FileType::Latex,
"sql" => FileType::Sql,
"csv" => FileType::Csv,
"ini" => FileType::Ini,
"dockerfile" => FileType::Dockerfile,
"makefile" => FileType::Makefile,
"gradle" => FileType::Gradle,
"pom.xml" => FileType::Maven,
"gitignore" => FileType::Gitignore,
"editorconfig" => FileType::EditorConfig,
"txt" | "text" | "plain" => FileType::TextPlain,
"bin" | "exe" => FileType::Binary,
_ => FileType::Unknown,
}
}
}