zip_core/raw/parse/
data_descriptor.rs

1use 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}