binocular/preview/archive/
detect.rs1use std::path::Path;
4
5#[derive(Clone, Copy, Debug)]
6pub enum ArchiveKind {
7 Zip,
8 TarGz,
9 TarBz2,
10 TarXz,
11 TarRaw,
12}
13
14pub fn detect_archive_kind(path: &Path) -> Option<ArchiveKind> {
15 let name = path.file_name()?.to_str()?.to_ascii_lowercase();
16
17 if name.ends_with(".zip")
18 || name.ends_with(".jar")
19 || name.ends_with(".war")
20 || name.ends_with(".ear")
21 || name.ends_with(".apk")
22 || name.ends_with(".ipa")
23 || name.ends_with(".whl")
24 || name.ends_with(".xlsx")
25 || name.ends_with(".docx")
26 || name.ends_with(".pptx")
27 || name.ends_with(".odt")
28 || name.ends_with(".ods")
29 {
30 return Some(ArchiveKind::Zip);
31 }
32 if name.ends_with(".tar.gz") || name.ends_with(".tgz") {
33 return Some(ArchiveKind::TarGz);
34 }
35 if name.ends_with(".tar.bz2") || name.ends_with(".tbz2") || name.ends_with(".tbz") {
36 return Some(ArchiveKind::TarBz2);
37 }
38 if name.ends_with(".tar.xz") || name.ends_with(".txz") {
39 return Some(ArchiveKind::TarXz);
40 }
41 if name.ends_with(".tar") {
42 return Some(ArchiveKind::TarRaw);
43 }
44 None
45}