mime_type/
archive.rs

1use crate::MimeFormat;
2use std::fmt::{self, Display, Formatter};
3
4/// Archive and compressed file formats.
5///
6/// Supports various compression and archive formats, as well as some document types.
7#[derive(Debug, Clone, PartialEq, Eq)]
8pub enum Archive {
9    /// Electronic Publication format (EPUB)
10    Epub,
11    /// ZIP archive format
12    Zip,
13    /// TAR archive format
14    Tar,
15    /// RAR archive format
16    Rar,
17    /// GZIP compressed format
18    Gz,
19    /// BZIP2 compressed format
20    Bz2,
21    /// BZIP3 compressed format
22    Bz3,
23    /// 7-Zip archive format
24    SevenZ,
25    /// XZ compressed format
26    Xz,
27    /// Portable Document Format
28    Pdf,
29    /// Shockwave Flash format
30    Swf,
31    /// Rich Text Format
32    Rtf,
33    /// Embedded OpenType font
34    Eot,
35    /// PostScript document
36    Ps,
37    /// SQLite database format
38    Sqlite,
39    /// Nintendo NES ROM format
40    Nes,
41    /// Chrome extension format
42    Crx,
43    /// Microsoft Cabinet archive
44    Cab,
45    /// Debian package format
46    Deb,
47    /// Unix archive format
48    Ar,
49    /// Unix compress format
50    Z,
51    /// LZIP compressed format
52    Lz,
53    /// RPM package format
54    Rpm,
55    /// DICOM medical image format
56    Dcm,
57    /// Zstandard compressed format
58    Zst,
59    /// LZ4 compressed format
60    Lz4,
61    /// Microsoft Installer package
62    Msi,
63    /// CPIO archive format
64    Cpio,
65    /// PAR2 parity archive
66    Par2,
67}
68
69impl Display for Archive {
70    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
71        let mime_str = match self {
72            Archive::Epub => "application/epub+zip",
73            Archive::Zip => "application/zip",
74            Archive::Tar => "application/x-tar",
75            Archive::Rar => "application/vnd.rar",
76            Archive::Gz => "application/gzip",
77            Archive::Bz2 => "application/x-bzip2",
78            Archive::Bz3 => "application/vnd.bzip3",
79            Archive::SevenZ => "application/x-7z-compressed",
80            Archive::Xz => "application/x-xz",
81            Archive::Pdf => "application/pdf",
82            Archive::Swf => "application/x-shockwave-flash",
83            Archive::Rtf => "application/rtf",
84            Archive::Eot => "application/octet-stream",
85            Archive::Ps => "application/postscript",
86            Archive::Sqlite => "application/vnd.sqlite3",
87            Archive::Nes => "application/x-nintendo-nes-rom",
88            Archive::Crx => "application/x-google-chrome-extension",
89            Archive::Cab => "application/vnd.ms-cab-compressed",
90            Archive::Deb => "application/vnd.debian.binary-package",
91            Archive::Ar => "application/x-unix-archive",
92            Archive::Z => "application/x-compress",
93            Archive::Lz => "application/x-lzip",
94            Archive::Rpm => "application/x-rpm",
95            Archive::Dcm => "application/dicom",
96            Archive::Zst => "application/zstd",
97            Archive::Lz4 => "application/x-lz4",
98            Archive::Msi => "application/x-ole-storage",
99            Archive::Cpio => "application/x-cpio",
100            Archive::Par2 => "application/x-par2",
101        };
102        write!(f, "{}", mime_str)
103    }
104}
105
106impl MimeFormat for Archive {
107    fn from_ext(ext: &str) -> Option<crate::MimeType> {
108        match ext {
109            "epub" => Some(crate::MimeType::Archive(Archive::Epub)),
110            "zip" => Some(crate::MimeType::Archive(Archive::Zip)),
111            "tar" => Some(crate::MimeType::Archive(Archive::Tar)),
112            "rar" => Some(crate::MimeType::Archive(Archive::Rar)),
113            "gz" => Some(crate::MimeType::Archive(Archive::Gz)),
114            "bz2" => Some(crate::MimeType::Archive(Archive::Bz2)),
115            "bz3" => Some(crate::MimeType::Archive(Archive::Bz3)),
116            "7z" => Some(crate::MimeType::Archive(Archive::SevenZ)),
117            "xz" => Some(crate::MimeType::Archive(Archive::Xz)),
118            "pdf" => Some(crate::MimeType::Archive(Archive::Pdf)),
119            "swf" => Some(crate::MimeType::Archive(Archive::Swf)),
120            "rtf" => Some(crate::MimeType::Archive(Archive::Rtf)),
121            "eot" => Some(crate::MimeType::Archive(Archive::Eot)),
122            "ps" => Some(crate::MimeType::Archive(Archive::Ps)),
123            "sqlite" => Some(crate::MimeType::Archive(Archive::Sqlite)),
124            "nes" => Some(crate::MimeType::Archive(Archive::Nes)),
125            "crx" => Some(crate::MimeType::Archive(Archive::Crx)),
126            "cab" => Some(crate::MimeType::Archive(Archive::Cab)),
127            "deb" => Some(crate::MimeType::Archive(Archive::Deb)),
128            "ar" => Some(crate::MimeType::Archive(Archive::Ar)),
129            "Z" => Some(crate::MimeType::Archive(Archive::Z)),
130            "lz" => Some(crate::MimeType::Archive(Archive::Lz)),
131            "rpm" => Some(crate::MimeType::Archive(Archive::Rpm)),
132            "dcm" => Some(crate::MimeType::Archive(Archive::Dcm)),
133            "zst" => Some(crate::MimeType::Archive(Archive::Zst)),
134            "lz4" => Some(crate::MimeType::Archive(Archive::Lz4)),
135            "msi" => Some(crate::MimeType::Archive(Archive::Msi)),
136            "cpio" => Some(crate::MimeType::Archive(Archive::Cpio)),
137            "par2" => Some(crate::MimeType::Archive(Archive::Par2)),
138            _ => None,
139        }
140    }
141
142    fn from_mime(mime: &str) -> Option<crate::MimeType> {
143        match mime {
144            "application/epub+zip" => Some(crate::MimeType::Archive(Archive::Epub)),
145            "application/zip" => Some(crate::MimeType::Archive(Archive::Zip)),
146            "application/x-tar" => Some(crate::MimeType::Archive(Archive::Tar)),
147            "application/vnd.rar" => Some(crate::MimeType::Archive(Archive::Rar)),
148            "application/gzip" => Some(crate::MimeType::Archive(Archive::Gz)),
149            "application/x-bzip2" => Some(crate::MimeType::Archive(Archive::Bz2)),
150            "application/vnd.bzip3" => Some(crate::MimeType::Archive(Archive::Bz3)),
151            "application/x-7z-compressed" => Some(crate::MimeType::Archive(Archive::SevenZ)),
152            "application/x-xz" => Some(crate::MimeType::Archive(Archive::Xz)),
153            "application/pdf" => Some(crate::MimeType::Archive(Archive::Pdf)),
154            "application/x-shockwave-flash" => Some(crate::MimeType::Archive(Archive::Swf)),
155            "application/rtf" => Some(crate::MimeType::Archive(Archive::Rtf)),
156            "application/octet-stream" => Some(crate::MimeType::Archive(Archive::Eot)),
157            "application/postscript" => Some(crate::MimeType::Archive(Archive::Ps)),
158            "application/vnd.sqlite3" => Some(crate::MimeType::Archive(Archive::Sqlite)),
159            "application/x-nintendo-nes-rom" => Some(crate::MimeType::Archive(Archive::Nes)),
160            "application/x-google-chrome-extension" => Some(crate::MimeType::Archive(Archive::Crx)),
161            "application/vnd.ms-cab-compressed" => Some(crate::MimeType::Archive(Archive::Cab)),
162            "application/vnd.debian.binary-package" => Some(crate::MimeType::Archive(Archive::Deb)),
163            "application/x-unix-archive" => Some(crate::MimeType::Archive(Archive::Ar)),
164            "application/x-compress" => Some(crate::MimeType::Archive(Archive::Z)),
165            "application/x-lzip" => Some(crate::MimeType::Archive(Archive::Lz)),
166            "application/x-rpm" => Some(crate::MimeType::Archive(Archive::Rpm)),
167            "application/dicom" => Some(crate::MimeType::Archive(Archive::Dcm)),
168            "application/zstd" => Some(crate::MimeType::Archive(Archive::Zst)),
169            "application/x-lz4" => Some(crate::MimeType::Archive(Archive::Lz4)),
170            "application/x-ole-storage" => Some(crate::MimeType::Archive(Archive::Msi)),
171            "application/x-cpio" => Some(crate::MimeType::Archive(Archive::Cpio)),
172            "application/x-par2" => Some(crate::MimeType::Archive(Archive::Par2)),
173            _ => None,
174        }
175    }
176}