Skip to main content

binocular/preview/archive/
detect.rs

1//! Archive format detection.
2
3use 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}