#![forbid(unsafe_code)]
#![doc = include_str!("../README.md")]
use core::fmt;
pub const TAR_EXTENSION: &str = "tar";
pub const TAR_GZIP_EXTENSION: &str = "tar.gz";
pub const TAR_XZ_EXTENSION: &str = "tar.xz";
pub const TAR_ZSTD_EXTENSION: &str = "tar.zst";
#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub enum TarEntryType {
#[default]
Regular,
Directory,
Symlink,
Hardlink,
BlockDevice,
CharacterDevice,
Fifo,
GlobalExtendedHeader,
ExtendedHeader,
Unknown,
}
impl TarEntryType {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Regular => "regular",
Self::Directory => "directory",
Self::Symlink => "symlink",
Self::Hardlink => "hardlink",
Self::BlockDevice => "block-device",
Self::CharacterDevice => "character-device",
Self::Fifo => "fifo",
Self::GlobalExtendedHeader => "global-extended-header",
Self::ExtendedHeader => "extended-header",
Self::Unknown => "unknown",
}
}
#[must_use]
pub const fn from_typeflag(typeflag: u8) -> Self {
match typeflag {
0 | b'0' => Self::Regular,
b'1' => Self::Hardlink,
b'2' => Self::Symlink,
b'3' => Self::CharacterDevice,
b'4' => Self::BlockDevice,
b'5' => Self::Directory,
b'6' => Self::Fifo,
b'g' => Self::GlobalExtendedHeader,
b'x' => Self::ExtendedHeader,
_ => Self::Unknown,
}
}
#[must_use]
pub const fn typeflag(self) -> Option<u8> {
match self {
Self::Regular => Some(b'0'),
Self::Hardlink => Some(b'1'),
Self::Symlink => Some(b'2'),
Self::CharacterDevice => Some(b'3'),
Self::BlockDevice => Some(b'4'),
Self::Directory => Some(b'5'),
Self::Fifo => Some(b'6'),
Self::GlobalExtendedHeader => Some(b'g'),
Self::ExtendedHeader => Some(b'x'),
Self::Unknown => None,
}
}
}
impl fmt::Display for TarEntryType {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(self.as_str())
}
}
#[cfg(test)]
mod tests {
use super::{TAR_EXTENSION, TAR_GZIP_EXTENSION, TarEntryType};
#[test]
fn maps_tar_typeflags() {
assert_eq!(TarEntryType::from_typeflag(b'5'), TarEntryType::Directory);
assert_eq!(TarEntryType::from_typeflag(b'2'), TarEntryType::Symlink);
assert_eq!(TarEntryType::Regular.typeflag(), Some(b'0'));
assert_eq!(TarEntryType::Unknown.typeflag(), None);
}
#[test]
fn exposes_tar_extension_labels() {
assert_eq!(TAR_EXTENSION, "tar");
assert_eq!(TAR_GZIP_EXTENSION, "tar.gz");
}
}