async_zip_futures/spec/
extra_field.rs

1// Copyright Cognite AS, 2023
2
3use 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}