pub trait ExtraFieldVersion {}
#[derive(Debug, Clone)]
pub struct LocalHeaderVersion;
#[derive(Debug, Clone)]
pub struct CentralHeaderVersion;
impl ExtraFieldVersion for LocalHeaderVersion {}
impl ExtraFieldVersion for CentralHeaderVersion {}
mod extended_timestamp;
mod ntfs;
mod zipinfo_utf8;
pub use extended_timestamp::*;
pub use ntfs::Ntfs;
pub use zipinfo_utf8::UnicodeExtraField;
#[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,
}
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, ];