1use phf::{phf_map, Map};
17
18use crate::fs::File;
19
20#[derive(Debug, Clone)]
21pub enum FileType {
22 Image,
23 Video,
24 Music,
25 Lossless, Crypto,
27 Document,
28 Compressed,
29 Temp,
30 Compiled,
31 Build, Source,
35}
36
37const FILENAME_TYPES: Map<&'static str, FileType> = phf_map! {
39 "Brewfile" => FileType::Build,
41 "bsconfig.json" => FileType::Build,
42 "BUILD" => FileType::Build,
43 "BUILD.bazel" => FileType::Build,
44 "build.gradle" => FileType::Build,
45 "build.sbt" => FileType::Build,
46 "build.xml" => FileType::Build,
47 "Cargo.toml" => FileType::Build,
48 "CMakeLists.txt" => FileType::Build,
49 "composer.json" => FileType::Build,
50 "configure" => FileType::Build,
51 "Containerfile" => FileType::Build,
52 "Dockerfile" => FileType::Build,
53 "Earthfile" => FileType::Build,
54 "flake.nix" => FileType::Build,
55 "Gemfile" => FileType::Build,
56 "GNUmakefile" => FileType::Build,
57 "Gruntfile.coffee" => FileType::Build,
58 "Gruntfile.js" => FileType::Build,
59 "jsconfig.json" => FileType::Build,
60 "Justfile" => FileType::Build,
61 "justfile" => FileType::Build,
62 "Makefile" => FileType::Build,
63 "makefile" => FileType::Build,
64 "meson.build" => FileType::Build,
65 "mix.exs" => FileType::Build,
66 "package.json" => FileType::Build,
67 "Pipfile" => FileType::Build,
68 "PKGBUILD" => FileType::Build,
69 "Podfile" => FileType::Build,
70 "pom.xml" => FileType::Build,
71 "Procfile" => FileType::Build,
72 "pyproject.toml" => FileType::Build,
73 "Rakefile" => FileType::Build,
74 "RoboFile.php" => FileType::Build,
75 "SConstruct" => FileType::Build,
76 "tsconfig.json" => FileType::Build,
77 "Vagrantfile" => FileType::Build,
78 "webpack.config.cjs" => FileType::Build,
79 "webpack.config.js" => FileType::Build,
80 "WORKSPACE" => FileType::Build,
81 "id_dsa" => FileType::Crypto,
83 "id_ecdsa" => FileType::Crypto,
84 "id_ecdsa_sk" => FileType::Crypto,
85 "id_ed25519" => FileType::Crypto,
86 "id_ed25519_sk" => FileType::Crypto,
87 "id_rsa" => FileType::Crypto,
88};
89
90const EXTENSION_TYPES: Map<&'static str, FileType> = phf_map! {
93 "ninja" => FileType::Build,
95 "arw" => FileType::Image,
97 "avif" => FileType::Image,
98 "bmp" => FileType::Image,
99 "cbr" => FileType::Image,
100 "cbz" => FileType::Image,
101 "cr2" => FileType::Image,
102 "dvi" => FileType::Image,
103 "eps" => FileType::Image,
104 "fodg" => FileType::Image,
105 "gif" => FileType::Image,
106 "heic" => FileType::Image,
107 "heif" => FileType::Image,
108 "ico" => FileType::Image,
109 "j2c" => FileType::Image,
110 "j2k" => FileType::Image,
111 "jfi" => FileType::Image,
112 "jfif" => FileType::Image,
113 "jif" => FileType::Image,
114 "jp2" => FileType::Image,
115 "jpe" => FileType::Image,
116 "jpeg" => FileType::Image,
117 "jpf" => FileType::Image,
118 "jpg" => FileType::Image,
119 "jpx" => FileType::Image,
120 "jxl" => FileType::Image,
121 "kra" => FileType::Image,
122 "krz" => FileType::Image,
123 "nef" => FileType::Image,
124 "odg" => FileType::Image,
125 "orf" => FileType::Image,
126 "pbm" => FileType::Image,
127 "pgm" => FileType::Image,
128 "png" => FileType::Image,
129 "pnm" => FileType::Image,
130 "ppm" => FileType::Image,
131 "ps" => FileType::Image,
132 "psd" => FileType::Image,
133 "pxm" => FileType::Image,
134 "raw" => FileType::Image,
135 "qoi" => FileType::Image,
136 "svg" => FileType::Image,
137 "tif" => FileType::Image,
138 "tiff" => FileType::Image,
139 "webp" => FileType::Image,
140 "xcf" => FileType::Image,
141 "xpm" => FileType::Image,
142 "avi" => FileType::Video,
144 "flv" => FileType::Video,
145 "h264" => FileType::Video,
146 "heics" => FileType::Video,
147 "m2ts" => FileType::Video,
148 "m2v" => FileType::Video,
149 "m4v" => FileType::Video,
150 "mkv" => FileType::Video,
151 "mov" => FileType::Video,
152 "mp4" => FileType::Video,
153 "mpeg" => FileType::Video,
154 "mpg" => FileType::Video,
155 "ogm" => FileType::Video,
156 "ogv" => FileType::Video,
157 "video" => FileType::Video,
158 "vob" => FileType::Video,
159 "webm" => FileType::Video,
160 "wmv" => FileType::Video,
161 "aac" => FileType::Music, "m4a" => FileType::Music,
164 "mka" => FileType::Music,
165 "mp2" => FileType::Music,
166 "mp3" => FileType::Music,
167 "ogg" => FileType::Music,
168 "opus" => FileType::Music,
169 "wma" => FileType::Music,
170 "aif" => FileType::Lossless,
172 "aifc" => FileType::Lossless,
173 "aiff" => FileType::Lossless,
174 "alac" => FileType::Lossless,
175 "ape" => FileType::Lossless,
176 "flac" => FileType::Lossless,
177 "pcm" => FileType::Lossless,
178 "wav" => FileType::Lossless,
179 "wv" => FileType::Lossless,
180 "age" => FileType::Crypto, "asc" => FileType::Crypto, "cer" => FileType::Crypto,
184 "crt" => FileType::Crypto,
185 "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,
203 "doc" => FileType::Document,
204 "docx" => FileType::Document,
205 "eml" => FileType::Document,
206 "fodp" => FileType::Document,
207 "fods" => FileType::Document,
208 "fodt" => FileType::Document,
209 "fotd" => FileType::Document,
210 "gdoc" => FileType::Document,
211 "key" => FileType::Document,
212 "keynote" => FileType::Document,
213 "numbers" => FileType::Document,
214 "odp" => FileType::Document,
215 "ods" => FileType::Document,
216 "odt" => FileType::Document,
217 "pages" => FileType::Document,
218 "pdf" => FileType::Document,
219 "ppt" => FileType::Document,
220 "pptx" => FileType::Document,
221 "rtf" => FileType::Document, "xls" => FileType::Document,
223 "xlsm" => FileType::Document,
224 "xlsx" => FileType::Document,
225 "7z" => FileType::Compressed, "ar" => FileType::Compressed,
228 "arj" => FileType::Compressed,
229 "br" => FileType::Compressed, "bz" => FileType::Compressed, "bz2" => FileType::Compressed, "bz3" => FileType::Compressed, "cpio" => FileType::Compressed,
234 "deb" => FileType::Compressed, "dmg" => FileType::Compressed,
236 "gz" => FileType::Compressed, "iso" => FileType::Compressed,
238 "lz" => FileType::Compressed,
239 "lz4" => FileType::Compressed,
240 "lzh" => FileType::Compressed,
241 "lzma" => FileType::Compressed,
242 "lzo" => FileType::Compressed,
243 "phar" => FileType::Compressed, "qcow" => FileType::Compressed,
245 "qcow2" => FileType::Compressed,
246 "rar" => FileType::Compressed,
247 "rpm" => FileType::Compressed,
248 "tar" => FileType::Compressed,
249 "taz" => FileType::Compressed,
250 "tbz" => FileType::Compressed,
251 "tbz2" => FileType::Compressed,
252 "tc" => FileType::Compressed,
253 "tgz" => FileType::Compressed,
254 "tlz" => FileType::Compressed,
255 "txz" => FileType::Compressed,
256 "tz" => FileType::Compressed,
257 "xz" => FileType::Compressed,
258 "vdi" => FileType::Compressed,
259 "vhd" => FileType::Compressed,
260 "vhdx" => FileType::Compressed,
261 "vmdk" => FileType::Compressed,
262 "z" => FileType::Compressed,
263 "zip" => FileType::Compressed,
264 "zst" => FileType::Compressed, "bak" => FileType::Temp,
267 "bk" => FileType::Temp,
268 "bkp" => FileType::Temp,
269 "crdownload" => FileType::Temp,
270 "download" => FileType::Temp,
271 "fcbak" => FileType::Temp,
272 "fcstd1" => FileType::Temp,
273 "fdmdownload"=> FileType::Temp,
274 "part" => FileType::Temp,
275 "swn" => FileType::Temp,
276 "swo" => FileType::Temp,
277 "swp" => FileType::Temp,
278 "tmp" => FileType::Temp,
279 "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,
356 "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, };
413
414impl FileType {
415 pub(crate) fn get_file_type(file: &File<'_>) -> Option<FileType> {
419 if file.name.to_lowercase().starts_with("readme") {
421 return Some(Self::Build);
422 }
423 if let Some(file_type) = FILENAME_TYPES.get(&file.name) {
424 return Some(file_type.clone());
425 }
426 if let Some(file_type) = file.ext.as_ref().and_then(|ext| EXTENSION_TYPES.get(ext)) {
427 return Some(file_type.clone());
428 }
429 if file.name.ends_with('~') || (file.name.starts_with('#') && file.name.ends_with('#')) {
430 return Some(Self::Temp);
431 }
432 if let Some(dir) = file.parent_dir {
433 if file
434 .get_source_files()
435 .iter()
436 .any(|path| dir.contains(path))
437 {
438 return Some(Self::Compiled);
439 }
440 }
441 None
442 }
443}