mime-type 0.1.0

A Rust library for handling MIME types.
Documentation
use crate::MimeFormat;
use std::fmt::{self, Display, Formatter};

/// Archive and compressed file formats.
///
/// Supports various compression and archive formats, as well as some document types.
pub enum Archive {
    /// Electronic Publication format (EPUB)
    Epub,
    /// ZIP archive format
    Zip,
    /// TAR archive format
    Tar,
    /// RAR archive format
    Rar,
    /// GZIP compressed format
    Gz,
    /// BZIP2 compressed format
    Bz2,
    /// BZIP3 compressed format
    Bz3,
    /// 7-Zip archive format
    SevenZ,
    /// XZ compressed format
    Xz,
    /// Portable Document Format
    Pdf,
    /// Shockwave Flash format
    Swf,
    /// Rich Text Format
    Rtf,
    /// Embedded OpenType font
    Eot,
    /// PostScript document
    Ps,
    /// SQLite database format
    Sqlite,
    /// Nintendo NES ROM format
    Nes,
    /// Chrome extension format
    Crx,
    /// Microsoft Cabinet archive
    Cab,
    /// Debian package format
    Deb,
    /// Unix archive format
    Ar,
    /// Unix compress format
    Z,
    /// LZIP compressed format
    Lz,
    /// RPM package format
    Rpm,
    /// DICOM medical image format
    Dcm,
    /// Zstandard compressed format
    Zst,
    /// LZ4 compressed format
    Lz4,
    /// Microsoft Installer package
    Msi,
    /// CPIO archive format
    Cpio,
    /// PAR2 parity archive
    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,
        }
    }
}