1use crate::MimeFormat;
2use std::fmt::{self, Display, Formatter};
3
4#[derive(Debug, Clone, PartialEq, Eq)]
8pub enum Archive {
9 Epub,
11 Zip,
13 Tar,
15 Rar,
17 Gz,
19 Bz2,
21 Bz3,
23 SevenZ,
25 Xz,
27 Pdf,
29 Swf,
31 Rtf,
33 Eot,
35 Ps,
37 Sqlite,
39 Nes,
41 Crx,
43 Cab,
45 Deb,
47 Ar,
49 Z,
51 Lz,
53 Rpm,
55 Dcm,
57 Zst,
59 Lz4,
61 Msi,
63 Cpio,
65 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}