async_zip_futures/spec/
extra_field.rs1use crate::spec::header::{ExtraField, HeaderId, UnknownExtraField, Zip64ExtendedInformationExtraField};
4
5impl From<u16> for HeaderId {
6 fn from(value: u16) -> Self {
7 match value {
8 0x0001 => Self::Zip64ExtendedInformationExtraField,
9 other => Self::Other(other),
10 }
11 }
12}
13
14impl From<HeaderId> for u16 {
15 fn from(value: HeaderId) -> Self {
16 match value {
17 HeaderId::Zip64ExtendedInformationExtraField => 0x0001,
18 HeaderId::Other(other) => other,
19 }
20 }
21}
22
23pub(crate) trait ExtraFieldAsBytes {
24 fn as_bytes(&self) -> Vec<u8>;
25
26 fn count_bytes(&self) -> usize;
27}
28
29impl ExtraFieldAsBytes for &[ExtraField] {
30 fn as_bytes(&self) -> Vec<u8> {
31 let mut buffer = Vec::new();
32 for field in self.iter() {
33 buffer.append(&mut field.as_bytes());
34 }
35 buffer
36 }
37
38 fn count_bytes(&self) -> usize {
39 self.iter().map(|field| field.count_bytes()).sum()
40 }
41}
42
43impl ExtraFieldAsBytes for ExtraField {
44 fn as_bytes(&self) -> Vec<u8> {
45 match self {
46 ExtraField::Zip64ExtendedInformationExtraField(field) => field.as_bytes(),
47 ExtraField::UnknownExtraField(field) => field.as_bytes(),
48 }
49 }
50
51 fn count_bytes(&self) -> usize {
52 match self {
53 ExtraField::Zip64ExtendedInformationExtraField(field) => field.count_bytes(),
54 ExtraField::UnknownExtraField(field) => field.count_bytes(),
55 }
56 }
57}
58
59impl ExtraFieldAsBytes for UnknownExtraField {
60 fn as_bytes(&self) -> Vec<u8> {
61 let mut bytes = Vec::new();
62 let header_id: u16 = self.header_id.into();
63 bytes.append(&mut header_id.to_le_bytes().to_vec());
64 bytes.append(&mut self.data_size.to_le_bytes().to_vec());
65 bytes.append(&mut self.content.clone());
66
67 bytes
68 }
69
70 fn count_bytes(&self) -> usize {
71 4 + self.content.len()
72 }
73}
74
75impl ExtraFieldAsBytes for Zip64ExtendedInformationExtraField {
76 fn as_bytes(&self) -> Vec<u8> {
77 let mut bytes = Vec::new();
78 let header_id: u16 = self.header_id.into();
79 bytes.append(&mut header_id.to_le_bytes().to_vec());
80 bytes.append(&mut self.data_size.to_le_bytes().to_vec());
81 bytes.append(&mut self.uncompressed_size.to_le_bytes().to_vec());
82 bytes.append(&mut self.compressed_size.to_le_bytes().to_vec());
83 if let Some(relative_header_offset) = &self.relative_header_offset {
84 bytes.append(&mut relative_header_offset.to_le_bytes().to_vec());
85 }
86 if let Some(disk_start_number) = &self.disk_start_number {
87 bytes.append(&mut disk_start_number.to_le_bytes().to_vec());
88 }
89
90 bytes
91 }
92
93 fn count_bytes(&self) -> usize {
94 20 + self.relative_header_offset.map(|_| 8).unwrap_or_default()
95 + self.disk_start_number.map(|_| 8).unwrap_or_default()
96 }
97}