use crate::MimeFormat;
use std::fmt::{self, Display, Formatter};
pub enum Archive {
Epub,
Zip,
Tar,
Rar,
Gz,
Bz2,
Bz3,
SevenZ,
Xz,
Pdf,
Swf,
Rtf,
Eot,
Ps,
Sqlite,
Nes,
Crx,
Cab,
Deb,
Ar,
Z,
Lz,
Rpm,
Dcm,
Zst,
Lz4,
Msi,
Cpio,
Par2,
}
impl Display for Archive {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
let mime_str = match self {
Archive::Epub => "application/epub+zip",
Archive::Zip => "application/zip",
Archive::Tar => "application/x-tar",
Archive::Rar => "application/vnd.rar",
Archive::Gz => "application/gzip",
Archive::Bz2 => "application/x-bzip2",
Archive::Bz3 => "application/vnd.bzip3",
Archive::SevenZ => "application/x-7z-compressed",
Archive::Xz => "application/x-xz",
Archive::Pdf => "application/pdf",
Archive::Swf => "application/x-shockwave-flash",
Archive::Rtf => "application/rtf",
Archive::Eot => "application/octet-stream",
Archive::Ps => "application/postscript",
Archive::Sqlite => "application/vnd.sqlite3",
Archive::Nes => "application/x-nintendo-nes-rom",
Archive::Crx => "application/x-google-chrome-extension",
Archive::Cab => "application/vnd.ms-cab-compressed",
Archive::Deb => "application/vnd.debian.binary-package",
Archive::Ar => "application/x-unix-archive",
Archive::Z => "application/x-compress",
Archive::Lz => "application/x-lzip",
Archive::Rpm => "application/x-rpm",
Archive::Dcm => "application/dicom",
Archive::Zst => "application/zstd",
Archive::Lz4 => "application/x-lz4",
Archive::Msi => "application/x-ole-storage",
Archive::Cpio => "application/x-cpio",
Archive::Par2 => "application/x-par2",
};
write!(f, "{}", mime_str)
}
}
impl MimeFormat for Archive {
fn from_ext(ext: &str) -> Option<crate::MimeType> {
match ext {
"epub" => Some(crate::MimeType::Archive(Archive::Epub)),
"zip" => Some(crate::MimeType::Archive(Archive::Zip)),
"tar" => Some(crate::MimeType::Archive(Archive::Tar)),
"rar" => Some(crate::MimeType::Archive(Archive::Rar)),
"gz" => Some(crate::MimeType::Archive(Archive::Gz)),
"bz2" => Some(crate::MimeType::Archive(Archive::Bz2)),
"bz3" => Some(crate::MimeType::Archive(Archive::Bz3)),
"7z" => Some(crate::MimeType::Archive(Archive::SevenZ)),
"xz" => Some(crate::MimeType::Archive(Archive::Xz)),
"pdf" => Some(crate::MimeType::Archive(Archive::Pdf)),
"swf" => Some(crate::MimeType::Archive(Archive::Swf)),
"rtf" => Some(crate::MimeType::Archive(Archive::Rtf)),
"eot" => Some(crate::MimeType::Archive(Archive::Eot)),
"ps" => Some(crate::MimeType::Archive(Archive::Ps)),
"sqlite" => Some(crate::MimeType::Archive(Archive::Sqlite)),
"nes" => Some(crate::MimeType::Archive(Archive::Nes)),
"crx" => Some(crate::MimeType::Archive(Archive::Crx)),
"cab" => Some(crate::MimeType::Archive(Archive::Cab)),
"deb" => Some(crate::MimeType::Archive(Archive::Deb)),
"ar" => Some(crate::MimeType::Archive(Archive::Ar)),
"Z" => Some(crate::MimeType::Archive(Archive::Z)),
"lz" => Some(crate::MimeType::Archive(Archive::Lz)),
"rpm" => Some(crate::MimeType::Archive(Archive::Rpm)),
"dcm" => Some(crate::MimeType::Archive(Archive::Dcm)),
"zst" => Some(crate::MimeType::Archive(Archive::Zst)),
"lz4" => Some(crate::MimeType::Archive(Archive::Lz4)),
"msi" => Some(crate::MimeType::Archive(Archive::Msi)),
"cpio" => Some(crate::MimeType::Archive(Archive::Cpio)),
"par2" => Some(crate::MimeType::Archive(Archive::Par2)),
_ => None,
}
}
fn from_mime(mime: &str) -> Option<crate::MimeType> {
match mime {
"application/epub+zip" => Some(crate::MimeType::Archive(Archive::Epub)),
"application/zip" => Some(crate::MimeType::Archive(Archive::Zip)),
"application/x-tar" => Some(crate::MimeType::Archive(Archive::Tar)),
"application/vnd.rar" => Some(crate::MimeType::Archive(Archive::Rar)),
"application/gzip" => Some(crate::MimeType::Archive(Archive::Gz)),
"application/x-bzip2" => Some(crate::MimeType::Archive(Archive::Bz2)),
"application/vnd.bzip3" => Some(crate::MimeType::Archive(Archive::Bz3)),
"application/x-7z-compressed" => Some(crate::MimeType::Archive(Archive::SevenZ)),
"application/x-xz" => Some(crate::MimeType::Archive(Archive::Xz)),
"application/pdf" => Some(crate::MimeType::Archive(Archive::Pdf)),
"application/x-shockwave-flash" => Some(crate::MimeType::Archive(Archive::Swf)),
"application/rtf" => Some(crate::MimeType::Archive(Archive::Rtf)),
"application/octet-stream" => Some(crate::MimeType::Archive(Archive::Eot)),
"application/postscript" => Some(crate::MimeType::Archive(Archive::Ps)),
"application/vnd.sqlite3" => Some(crate::MimeType::Archive(Archive::Sqlite)),
"application/x-nintendo-nes-rom" => Some(crate::MimeType::Archive(Archive::Nes)),
"application/x-google-chrome-extension" => Some(crate::MimeType::Archive(Archive::Crx)),
"application/vnd.ms-cab-compressed" => Some(crate::MimeType::Archive(Archive::Cab)),
"application/vnd.debian.binary-package" => Some(crate::MimeType::Archive(Archive::Deb)),
"application/x-unix-archive" => Some(crate::MimeType::Archive(Archive::Ar)),
"application/x-compress" => Some(crate::MimeType::Archive(Archive::Z)),
"application/x-lzip" => Some(crate::MimeType::Archive(Archive::Lz)),
"application/x-rpm" => Some(crate::MimeType::Archive(Archive::Rpm)),
"application/dicom" => Some(crate::MimeType::Archive(Archive::Dcm)),
"application/zstd" => Some(crate::MimeType::Archive(Archive::Zst)),
"application/x-lz4" => Some(crate::MimeType::Archive(Archive::Lz4)),
"application/x-ole-storage" => Some(crate::MimeType::Archive(Archive::Msi)),
"application/x-cpio" => Some(crate::MimeType::Archive(Archive::Cpio)),
"application/x-par2" => Some(crate::MimeType::Archive(Archive::Par2)),
_ => None,
}
}
}