use phf::{phf_map, Map};
use crate::fs::File;
#[derive(Debug, Clone)]
pub enum FileType {
Image,
Video,
Music,
Lossless, Crypto,
Document,
Compressed,
Temp,
Compiled,
Build, Source,
}
const FILENAME_TYPES: Map<&'static str, FileType> = phf_map! {
"Brewfile" => FileType::Build,
"bsconfig.json" => FileType::Build,
"BUILD" => FileType::Build,
"BUILD.bazel" => FileType::Build,
"build.gradle" => FileType::Build,
"build.sbt" => FileType::Build,
"build.xml" => FileType::Build,
"Cargo.toml" => FileType::Build,
"CMakeLists.txt" => FileType::Build,
"composer.json" => FileType::Build,
"configure" => FileType::Build,
"Containerfile" => FileType::Build,
"Dockerfile" => FileType::Build,
"Earthfile" => FileType::Build,
"flake.nix" => FileType::Build,
"Gemfile" => FileType::Build,
"GNUmakefile" => FileType::Build,
"Gruntfile.coffee" => FileType::Build,
"Gruntfile.js" => FileType::Build,
"jsconfig.json" => FileType::Build,
"Justfile" => FileType::Build,
"justfile" => FileType::Build,
"Makefile" => FileType::Build,
"makefile" => FileType::Build,
"meson.build" => FileType::Build,
"mix.exs" => FileType::Build,
"package.json" => FileType::Build,
"Pipfile" => FileType::Build,
"PKGBUILD" => FileType::Build,
"Podfile" => FileType::Build,
"pom.xml" => FileType::Build,
"Procfile" => FileType::Build,
"pyproject.toml" => FileType::Build,
"Rakefile" => FileType::Build,
"RoboFile.php" => FileType::Build,
"SConstruct" => FileType::Build,
"tsconfig.json" => FileType::Build,
"Vagrantfile" => FileType::Build,
"webpack.config.cjs" => FileType::Build,
"webpack.config.js" => FileType::Build,
"WORKSPACE" => FileType::Build,
"id_dsa" => FileType::Crypto,
"id_ecdsa" => FileType::Crypto,
"id_ecdsa_sk" => FileType::Crypto,
"id_ed25519" => FileType::Crypto,
"id_ed25519_sk" => FileType::Crypto,
"id_rsa" => FileType::Crypto,
};
const EXTENSION_TYPES: Map<&'static str, FileType> = phf_map! {
"ninja" => FileType::Build,
"arw" => FileType::Image,
"avif" => FileType::Image,
"bmp" => FileType::Image,
"cbr" => FileType::Image,
"cbz" => FileType::Image,
"cr2" => FileType::Image,
"dvi" => FileType::Image,
"eps" => FileType::Image,
"fodg" => FileType::Image,
"gif" => FileType::Image,
"heic" => FileType::Image,
"heif" => FileType::Image,
"ico" => FileType::Image,
"j2c" => FileType::Image,
"j2k" => FileType::Image,
"jfi" => FileType::Image,
"jfif" => FileType::Image,
"jif" => FileType::Image,
"jp2" => FileType::Image,
"jpe" => FileType::Image,
"jpeg" => FileType::Image,
"jpf" => FileType::Image,
"jpg" => FileType::Image,
"jpx" => FileType::Image,
"jxl" => FileType::Image,
"kra" => FileType::Image,
"krz" => FileType::Image,
"nef" => FileType::Image,
"odg" => FileType::Image,
"orf" => FileType::Image,
"pbm" => FileType::Image,
"pgm" => FileType::Image,
"png" => FileType::Image,
"pnm" => FileType::Image,
"ppm" => FileType::Image,
"ps" => FileType::Image,
"psd" => FileType::Image,
"pxm" => FileType::Image,
"raw" => FileType::Image,
"qoi" => FileType::Image,
"svg" => FileType::Image,
"tif" => FileType::Image,
"tiff" => FileType::Image,
"webp" => FileType::Image,
"xcf" => FileType::Image,
"xpm" => FileType::Image,
"avi" => FileType::Video,
"flv" => FileType::Video,
"h264" => FileType::Video,
"heics" => FileType::Video,
"m2ts" => FileType::Video,
"m2v" => FileType::Video,
"m4v" => FileType::Video,
"mkv" => FileType::Video,
"mov" => FileType::Video,
"mp4" => FileType::Video,
"mpeg" => FileType::Video,
"mpg" => FileType::Video,
"ogm" => FileType::Video,
"ogv" => FileType::Video,
"video" => FileType::Video,
"vob" => FileType::Video,
"webm" => FileType::Video,
"wmv" => FileType::Video,
"aac" => FileType::Music, "m4a" => FileType::Music,
"mka" => FileType::Music,
"mp2" => FileType::Music,
"mp3" => FileType::Music,
"ogg" => FileType::Music,
"opus" => FileType::Music,
"wma" => FileType::Music,
"aif" => FileType::Lossless,
"aifc" => FileType::Lossless,
"aiff" => FileType::Lossless,
"alac" => FileType::Lossless,
"ape" => FileType::Lossless,
"flac" => FileType::Lossless,
"pcm" => FileType::Lossless,
"wav" => FileType::Lossless,
"wv" => FileType::Lossless,
"age" => FileType::Crypto, "asc" => FileType::Crypto, "cer" => FileType::Crypto,
"crt" => FileType::Crypto,
"csr" => FileType::Crypto, "gpg" => FileType::Crypto, "kbx" => FileType::Crypto, "md5" => FileType::Crypto, "p12" => FileType::Crypto, "pem" => FileType::Crypto, "pfx" => FileType::Crypto, "pgp" => FileType::Crypto, "pub" => FileType::Crypto, "sha1" => FileType::Crypto, "sha224" => FileType::Crypto, "sha256" => FileType::Crypto, "sha384" => FileType::Crypto, "sha512" => FileType::Crypto, "sig" => FileType::Crypto, "signature" => FileType::Crypto,
"djvu" => FileType::Document,
"doc" => FileType::Document,
"docx" => FileType::Document,
"eml" => FileType::Document,
"fodp" => FileType::Document,
"fods" => FileType::Document,
"fodt" => FileType::Document,
"fotd" => FileType::Document,
"gdoc" => FileType::Document,
"key" => FileType::Document,
"keynote" => FileType::Document,
"numbers" => FileType::Document,
"odp" => FileType::Document,
"ods" => FileType::Document,
"odt" => FileType::Document,
"pages" => FileType::Document,
"pdf" => FileType::Document,
"ppt" => FileType::Document,
"pptx" => FileType::Document,
"rtf" => FileType::Document, "xls" => FileType::Document,
"xlsm" => FileType::Document,
"xlsx" => FileType::Document,
"7z" => FileType::Compressed, "ar" => FileType::Compressed,
"arj" => FileType::Compressed,
"br" => FileType::Compressed, "bz" => FileType::Compressed, "bz2" => FileType::Compressed, "bz3" => FileType::Compressed, "cpio" => FileType::Compressed,
"deb" => FileType::Compressed, "dmg" => FileType::Compressed,
"gz" => FileType::Compressed, "iso" => FileType::Compressed,
"lz" => FileType::Compressed,
"lz4" => FileType::Compressed,
"lzh" => FileType::Compressed,
"lzma" => FileType::Compressed,
"lzo" => FileType::Compressed,
"phar" => FileType::Compressed, "qcow" => FileType::Compressed,
"qcow2" => FileType::Compressed,
"rar" => FileType::Compressed,
"rpm" => FileType::Compressed,
"tar" => FileType::Compressed,
"taz" => FileType::Compressed,
"tbz" => FileType::Compressed,
"tbz2" => FileType::Compressed,
"tc" => FileType::Compressed,
"tgz" => FileType::Compressed,
"tlz" => FileType::Compressed,
"txz" => FileType::Compressed,
"tz" => FileType::Compressed,
"xz" => FileType::Compressed,
"vdi" => FileType::Compressed,
"vhd" => FileType::Compressed,
"vhdx" => FileType::Compressed,
"vmdk" => FileType::Compressed,
"z" => FileType::Compressed,
"zip" => FileType::Compressed,
"zst" => FileType::Compressed,
"bak" => FileType::Temp,
"bk" => FileType::Temp,
"bkp" => FileType::Temp,
"crdownload" => FileType::Temp,
"download" => FileType::Temp,
"fcbak" => FileType::Temp,
"fcstd1" => FileType::Temp,
"fdmdownload"=> FileType::Temp,
"part" => FileType::Temp,
"swn" => FileType::Temp,
"swo" => FileType::Temp,
"swp" => FileType::Temp,
"tmp" => FileType::Temp,
"a" => FileType::Compiled, "bundle" => FileType::Compiled, "class" => FileType::Compiled, "cma" => FileType::Compiled, "cmi" => FileType::Compiled, "cmo" => FileType::Compiled, "cmx" => FileType::Compiled, "dll" => FileType::Compiled, "dylib" => FileType::Compiled, "elc" => FileType::Compiled, "elf" => FileType::Compiled, "ko" => FileType::Compiled, "lib" => FileType::Compiled, "o" => FileType::Compiled, "obj" => FileType::Compiled, "pyc" => FileType::Compiled, "pyd" => FileType::Compiled, "pyo" => FileType::Compiled, "so" => FileType::Compiled, "zwc" => FileType::Compiled,
"applescript"=> FileType::Source, "as" => FileType::Source, "asa" => FileType::Source, "awk" => FileType::Source, "c" => FileType::Source, "c++" => FileType::Source, "c++m" => FileType::Source, "cabal" => FileType::Source, "cc" => FileType::Source, "ccm" => FileType::Source, "clj" => FileType::Source, "cp" => FileType::Source, "cpp" => FileType::Source, "cppm" => FileType::Source, "cr" => FileType::Source, "cs" => FileType::Source, "css" => FileType::Source, "csx" => FileType::Source, "cu" => FileType::Source, "cxx" => FileType::Source, "cxxm" => FileType::Source, "cypher" => FileType::Source, "d" => FileType::Source, "dart" => FileType::Source, "di" => FileType::Source, "dpr" => FileType::Source, "el" => FileType::Source, "elm" => FileType::Source, "erl" => FileType::Source, "ex" => FileType::Source, "exs" => FileType::Source, "f" => FileType::Source, "f90" => FileType::Source, "fcmacro" => FileType::Source, "fcscript" => FileType::Source, "fnl" => FileType::Source, "for" => FileType::Source, "fs" => FileType::Source, "fsh" => FileType::Source, "fsi" => FileType::Source, "fsx" => FileType::Source, "gd" => FileType::Source, "go" => FileType::Source, "gradle" => FileType::Source, "groovy" => FileType::Source, "gvy" => FileType::Source, "h" => FileType::Source, "h++" => FileType::Source, "hh" => FileType::Source, "hpp" => FileType::Source, "hc" => FileType::Source, "hs" => FileType::Source, "htc" => FileType::Source, "hxx" => FileType::Source, "inc" => FileType::Source,
"inl" => FileType::Source, "ino" => FileType::Source, "ipynb" => FileType::Source, "ixx" => FileType::Source, "java" => FileType::Source, "jl" => FileType::Source, "js" => FileType::Source, "jsx" => FileType::Source, "kt" => FileType::Source, "kts" => FileType::Source, "kusto" => FileType::Source, "less" => FileType::Source, "lhs" => FileType::Source, "lisp" => FileType::Source, "ltx" => FileType::Source, "lua" => FileType::Source, "m" => FileType::Source, "malloy" => FileType::Source, "matlab" => FileType::Source, "ml" => FileType::Source, "mli" => FileType::Source, "mn" => FileType::Source, "nb" => FileType::Source, "p" => FileType::Source, "pas" => FileType::Source, "php" => FileType::Source, "pl" => FileType::Source, "pm" => FileType::Source, "pod" => FileType::Source, "pp" => FileType::Source, "prql" => FileType::Source, "ps1" => FileType::Source, "psd1" => FileType::Source, "psm1" => FileType::Source, "purs" => FileType::Source, "py" => FileType::Source, "r" => FileType::Source, "rb" => FileType::Source, "rs" => FileType::Source, "rq" => FileType::Source, "sass" => FileType::Source, "scala" => FileType::Source, "scm" => FileType::Source, "scad" => FileType::Source, "scss" => FileType::Source, "sld" => FileType::Source, "sql" => FileType::Source, "ss" => FileType::Source, "swift" => FileType::Source, "tcl" => FileType::Source, "tex" => FileType::Source, "ts" => FileType::Source, "v" => FileType::Source, "vb" => FileType::Source, "vsh" => FileType::Source, "zig" => FileType::Source, };
impl FileType {
pub(crate) fn get_file_type(file: &File<'_>) -> Option<FileType> {
if file.name.to_lowercase().starts_with("readme") {
return Some(Self::Build);
}
if let Some(file_type) = FILENAME_TYPES.get(&file.name) {
return Some(file_type.clone());
}
if let Some(file_type) = file.ext.as_ref().and_then(|ext| EXTENSION_TYPES.get(ext)) {
return Some(file_type.clone());
}
if file.name.ends_with('~') || (file.name.starts_with('#') && file.name.ends_with('#')) {
return Some(Self::Temp);
}
if let Some(dir) = file.parent_dir {
if file
.get_source_files()
.iter()
.any(|path| dir.contains(path))
{
return Some(Self::Compiled);
}
}
None
}
}