use mime_type::MimeType;
use crate::ArchiveError;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ArchiveFormat {
Zip,
Tar,
Ar,
Deb,
TarGz,
TarBz2,
TarXz,
TarZst,
TarLz4,
Gz,
Bz2,
Xz,
Lz4,
Zst,
SevenZ,
}
impl ArchiveFormat {
pub fn name(&self) -> &'static str {
match self {
Self::Zip => "ZIP",
Self::Tar => "TAR",
Self::Ar => "AR",
Self::Deb => "DEB",
Self::TarGz => "TAR.GZ",
Self::TarBz2 => "TAR.BZ2",
Self::TarXz => "TAR.XZ",
Self::TarZst => "TAR.ZST",
Self::TarLz4 => "TAR.LZ4",
Self::Gz => "GZIP",
Self::Bz2 => "BZIP2",
Self::Xz => "XZ",
Self::Lz4 => "LZ4",
Self::Zst => "ZSTD",
Self::SevenZ => "7Z",
}
}
pub fn is_supported_mime(mime: &MimeType) -> bool {
ArchiveFormat::try_from(mime).is_ok()
}
}
impl TryFrom<&MimeType> for ArchiveFormat {
type Error = ArchiveError;
fn try_from(mime: &MimeType) -> Result<Self, Self::Error> {
match mime {
MimeType::Archive(mime_type::Archive::Zip) => Ok(Self::Zip),
MimeType::Archive(mime_type::Archive::Tar) => Ok(Self::Tar),
MimeType::Archive(mime_type::Archive::Ar) => Ok(Self::Ar),
MimeType::Archive(mime_type::Archive::Deb) => Ok(Self::Deb),
MimeType::Archive(mime_type::Archive::Gz) => Ok(Self::Gz),
MimeType::Archive(mime_type::Archive::Bz2) => Ok(Self::Bz2),
MimeType::Archive(mime_type::Archive::Xz) => Ok(Self::Xz),
MimeType::Archive(mime_type::Archive::Lz4) => Ok(Self::Lz4),
MimeType::Archive(mime_type::Archive::Zst) => Ok(Self::Zst),
MimeType::Archive(mime_type::Archive::SevenZ) => Ok(Self::SevenZ),
_ => Err(ArchiveError::UnsupportedFormat(mime.to_string())),
}
}
}
impl TryFrom<MimeType> for ArchiveFormat {
type Error = ArchiveError;
fn try_from(mime: MimeType) -> Result<Self, Self::Error> {
ArchiveFormat::try_from(&mime)
}
}
impl From<&ArchiveFormat> for MimeType {
fn from(format: &ArchiveFormat) -> Self {
match format {
ArchiveFormat::Zip => MimeType::Archive(mime_type::Archive::Zip),
ArchiveFormat::Tar => MimeType::Archive(mime_type::Archive::Tar),
ArchiveFormat::Ar => MimeType::Archive(mime_type::Archive::Ar),
ArchiveFormat::Deb => MimeType::Archive(mime_type::Archive::Deb),
ArchiveFormat::Gz => MimeType::Archive(mime_type::Archive::Gz),
ArchiveFormat::Bz2 => MimeType::Archive(mime_type::Archive::Bz2),
ArchiveFormat::Xz => MimeType::Archive(mime_type::Archive::Xz),
ArchiveFormat::Lz4 => MimeType::Archive(mime_type::Archive::Lz4),
ArchiveFormat::Zst => MimeType::Archive(mime_type::Archive::Zst),
ArchiveFormat::SevenZ => MimeType::Archive(mime_type::Archive::SevenZ),
ArchiveFormat::TarGz => MimeType::Archive(mime_type::Archive::Gz),
ArchiveFormat::TarBz2 => MimeType::Archive(mime_type::Archive::Bz2),
ArchiveFormat::TarXz => MimeType::Archive(mime_type::Archive::Xz),
ArchiveFormat::TarZst => MimeType::Archive(mime_type::Archive::Zst),
ArchiveFormat::TarLz4 => MimeType::Archive(mime_type::Archive::Lz4),
}
}
}
impl From<ArchiveFormat> for MimeType {
fn from(format: ArchiveFormat) -> Self {
MimeType::from(&format)
}
}