use core::fmt::Display;
mod aex_encryption;
mod extended_timestamp;
mod ntfs;
mod zip64_extended_information;
mod zipinfo_utf8;
pub(crate) use aex_encryption::AexEncryption;
pub(crate) use zip64_extended_information::Zip64ExtendedInformation;
pub use extended_timestamp::ExtendedTimestamp;
pub use ntfs::Ntfs;
pub use zipinfo_utf8::UnicodeExtraField;
pub trait ExtraFieldVersion {}
#[derive(Debug, Clone)]
pub struct LocalHeaderVersion;
#[derive(Debug, Clone)]
pub struct CentralHeaderVersion;
impl ExtraFieldVersion for LocalHeaderVersion {}
impl ExtraFieldVersion for CentralHeaderVersion {}
#[derive(Debug, Clone)]
pub enum ExtraField {
Ntfs(Ntfs),
ExtendedTimestamp(ExtendedTimestamp),
}
#[repr(u16)]
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub(crate) enum UsedExtraField {
Zip64ExtendedInfo = 0x0001,
Ntfs = 0x000a,
ExtendedTimestamp = 0x5455,
UnicodeComment = 0x6375,
UnicodePath = 0x7075,
AeXEncryption = 0x9901,
DataStreamAlignment = 0xa11e,
}
impl UsedExtraField {
pub const fn to_le_bytes(self) -> [u8; 2] {
let field_u16 = self.as_u16();
field_u16.to_le_bytes()
}
pub const fn as_u16(self) -> u16 {
self as u16
}
}
impl From<UsedExtraField> for u16 {
fn from(value: UsedExtraField) -> Self {
value.as_u16()
}
}
impl Display for UsedExtraField {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "0x{:04X}", *self as u16)
}
}
macro_rules! extra_field_match {
($x:expr, $( $variant:path ),+ $(,)?) => {
match $x {
$(
v if v == $variant as u16 => Ok($variant),
)+
_ => Err(()),
}
};
}
impl TryFrom<u16> for UsedExtraField {
type Error = ();
fn try_from(value: u16) -> Result<Self, Self::Error> {
extra_field_match!(
value,
UsedExtraField::Zip64ExtendedInfo,
UsedExtraField::Ntfs,
UsedExtraField::ExtendedTimestamp,
UsedExtraField::UnicodeComment,
UsedExtraField::UnicodePath,
UsedExtraField::DataStreamAlignment,
UsedExtraField::AeXEncryption,
)
}
}
pub const EXTRA_FIELD_MAPPING: [u16; 59] = [
UsedExtraField::Zip64ExtendedInfo.as_u16(),
0x0007, 0x0008, 0x0009, UsedExtraField::Ntfs.as_u16(),
0x000c, 0x000d, 0x000e, 0x000f, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x0020, 0x0021, 0x0022, 0x0023, 0x0065, 0x0066, 0x07c8, 0x1986, 0x2605, 0x2705, 0x2805, 0x334d, 0x4154, 0x4341, 0x4453, 0x4690, 0x4704, 0x470f, 0x4854, 0x4b46, 0x4c41, 0x4d49, 0x4d63, 0x4f4c, 0x5356, UsedExtraField::ExtendedTimestamp.as_u16(),
0x554e, 0x5855, UsedExtraField::UnicodeComment.as_u16(),
0x6542, 0x6854, UsedExtraField::UnicodePath.as_u16(),
0x7441, 0x756e, 0x7855, 0x7875, UsedExtraField::AeXEncryption.as_u16(),
0x9902, UsedExtraField::DataStreamAlignment.as_u16(),
0xa220, 0xcafe, 0xd935, 0xe57a, 0xfd4a, ];