zip_core/raw/parse/
data_descriptor.rs1use super::{
2 super::{DataDescriptor, DataDescriptorSignature, DataDescriptorZip64, DataDescriptorZip64Signature},
3 validate_length, FixedSizeError, Parse,
4};
5
6impl Parse for DataDescriptor {
7 type Error = FixedSizeError;
8
9 fn from_buf<T: bytes::Buf>(buf: &mut T) -> Result<Self, Self::Error>
10 where
11 Self: Sized,
12 {
13 let remaining = buf.remaining();
14 validate_length(remaining, Self::SIZE_IN_BYTES, FixedSizeError::UnsufficientExactBytes)?;
15 Ok(Self {
16 crc_32: buf.get_u32_le(),
17 compressed_size: buf.get_u32_le(),
18 uncompressed_size: buf.get_u32_le(),
19 })
20 }
21
22 fn to_buf<T: bytes::BufMut>(&self, buf: &mut T) -> Result<(), Self::Error> {
23 let remaining = buf.remaining_mut();
24 validate_length(remaining, Self::SIZE_IN_BYTES, FixedSizeError::UnsufficientExactBytes)?;
25 buf.put_u32_le(self.crc_32);
26 buf.put_u32_le(self.compressed_size);
27 buf.put_u32_le(self.uncompressed_size);
28 Ok(())
29 }
30}
31
32impl Parse for DataDescriptorSignature {
33 type Error = FixedSizeError;
34
35 fn from_buf<T: bytes::Buf>(buf: &mut T) -> Result<Self, Self::Error>
36 where
37 Self: Sized,
38 {
39 let remaining = buf.remaining();
40 validate_length(remaining, Self::SIZE_IN_BYTES, FixedSizeError::UnsufficientExactBytes)?;
41 Ok(Self {
42 signature: buf.get_u32_le(),
43 crc_32: buf.get_u32_le(),
44 compressed_size: buf.get_u32_le(),
45 uncompressed_size: buf.get_u32_le(),
46 })
47 }
48
49 fn to_buf<T: bytes::BufMut>(&self, buf: &mut T) -> Result<(), Self::Error> {
50 let remaining = buf.remaining_mut();
51 validate_length(remaining, Self::SIZE_IN_BYTES, FixedSizeError::UnsufficientExactBytes)?;
52 buf.put_u32_le(self.signature);
53 buf.put_u32_le(self.crc_32);
54 buf.put_u32_le(self.compressed_size);
55 buf.put_u32_le(self.uncompressed_size);
56 Ok(())
57 }
58}
59
60impl Parse for DataDescriptorZip64 {
61 type Error = FixedSizeError;
62
63 fn from_buf<T: bytes::Buf>(buf: &mut T) -> Result<Self, Self::Error>
64 where
65 Self: Sized,
66 {
67 let remaining = buf.remaining();
68 validate_length(remaining, Self::SIZE_IN_BYTES, FixedSizeError::UnsufficientExactBytes)?;
69 Ok(Self {
70 crc_32: buf.get_u32_le(),
71 compressed_size: buf.get_u64_le(),
72 uncompressed_size: buf.get_u64_le(),
73 })
74 }
75
76 fn to_buf<T: bytes::BufMut>(&self, buf: &mut T) -> Result<(), Self::Error> {
77 let remaining = buf.remaining_mut();
78 validate_length(remaining, Self::SIZE_IN_BYTES, FixedSizeError::UnsufficientExactBytes)?;
79 buf.put_u32_le(self.crc_32);
80 buf.put_u64_le(self.compressed_size);
81 buf.put_u64_le(self.uncompressed_size);
82 Ok(())
83 }
84}
85
86impl Parse for DataDescriptorZip64Signature {
87 type Error = FixedSizeError;
88
89 fn from_buf<T: bytes::Buf>(buf: &mut T) -> Result<Self, Self::Error>
90 where
91 Self: Sized,
92 {
93 let remaining = buf.remaining();
94 validate_length(remaining, Self::SIZE_IN_BYTES, FixedSizeError::UnsufficientExactBytes)?;
95 Ok(Self {
96 signature: buf.get_u32_le(),
97 crc_32: buf.get_u32_le(),
98 compressed_size: buf.get_u64_le(),
99 uncompressed_size: buf.get_u64_le(),
100 })
101 }
102
103 fn to_buf<T: bytes::BufMut>(&self, buf: &mut T) -> Result<(), Self::Error> {
104 let remaining = buf.remaining_mut();
105 validate_length(remaining, Self::SIZE_IN_BYTES, FixedSizeError::UnsufficientExactBytes)?;
106 buf.put_u32_le(self.signature);
107 buf.put_u32_le(self.crc_32);
108 buf.put_u64_le(self.compressed_size);
109 buf.put_u64_le(self.uncompressed_size);
110 Ok(())
111 }
112}
113
114#[cfg(test)]
115mod tests {
116 use super::{super::*, *};
117
118 #[test]
119 fn cycle_data_descriptor() {
120 let dd = DataDescriptor {
121 crc_32: 1,
122 compressed_size: 2,
123 uncompressed_size: 3,
124 };
125 let mut buf = vec![];
126 dd.to_buf(&mut buf).unwrap();
127 assert_eq!(buf.len(), DataDescriptor::SIZE_IN_BYTES);
128 let mut readbuf = buf.as_slice();
129 let dd2 = DataDescriptor::from_buf(&mut readbuf).unwrap();
130 assert_eq!(dd, dd2);
131 }
132
133 #[test]
134 fn cycle_data_descriptor_signature() {
135 let dd = DataDescriptorSignature {
136 signature: 1,
137 crc_32: 2,
138 compressed_size: 3,
139 uncompressed_size: 4,
140 };
141 let mut buf = vec![];
142 dd.to_buf(&mut buf).unwrap();
143 assert_eq!(buf.len(), DataDescriptorSignature::SIZE_IN_BYTES);
144 let mut readbuf = buf.as_slice();
145 let dd2 = DataDescriptorSignature::from_buf(&mut readbuf).unwrap();
146 assert_eq!(dd, dd2);
147 }
148
149 #[test]
150 fn cycle_data_descriptor_zip64() {
151 let dd = DataDescriptorZip64 {
152 crc_32: 1,
153 compressed_size: 2,
154 uncompressed_size: 3,
155 };
156 let mut buf = vec![];
157 dd.to_buf(&mut buf).unwrap();
158 assert_eq!(buf.len(), DataDescriptorZip64::SIZE_IN_BYTES);
159 let mut readbuf = buf.as_slice();
160 let dd2 = DataDescriptorZip64::from_buf(&mut readbuf).unwrap();
161 assert_eq!(dd, dd2);
162 }
163
164 #[test]
165 fn cycle_data_descriptor_zip64_signature() {
166 let dd = DataDescriptorZip64Signature {
167 signature: 1,
168 crc_32: 2,
169 compressed_size: 3,
170 uncompressed_size: 4,
171 };
172 let mut buf = vec![];
173 dd.to_buf(&mut buf).unwrap();
174 assert_eq!(buf.len(), DataDescriptorZip64Signature::SIZE_IN_BYTES);
175 let mut readbuf = buf.as_slice();
176 let dd2 = DataDescriptorZip64Signature::from_buf(&mut readbuf).unwrap();
177 assert_eq!(dd, dd2);
178 }
179}