use crate::reader::{ZipArchive, ZipEntry};
use pith_digest::{Error, Result};
pub fn member_bytes(entry: &ZipEntry<'_>, content: &[u8]) -> Result<Vec<u8>> {
let name = entry.name().as_bytes();
let name_len = u32::try_from(name.len())
.map_err(|_| Error::BadValue("zip member name exceeds u32 length"))?;
let content_len = u64::try_from(content.len())
.map_err(|_| Error::BadValue("zip member content exceeds u64 length"))?;
let mut out = Vec::with_capacity(4 + name.len() + 2 + 1 + 8 + 8 + 4 + 8 + content.len());
out.extend_from_slice(&name_len.to_be_bytes());
out.extend_from_slice(name);
out.extend_from_slice(&entry.method().to_be_bytes());
out.push(u8::from(entry.uses_data_descriptor()));
out.extend_from_slice(&entry.compressed_size().to_be_bytes());
out.extend_from_slice(&entry.uncompressed_size().to_be_bytes());
out.extend_from_slice(&entry.crc32().to_be_bytes());
out.extend_from_slice(&content_len.to_be_bytes());
out.extend_from_slice(content);
Ok(out)
}
pub fn members_stream(archive: &ZipArchive<'_>) -> Result<Vec<u8>> {
let count = u32::try_from(archive.len())
.map_err(|_| Error::BadValue("zip member count exceeds u32"))?;
let mut out = Vec::new();
out.extend_from_slice(&count.to_be_bytes());
for entry in archive.entries() {
let content = archive.extract(entry)?;
out.extend_from_slice(&member_bytes(entry, &content)?);
}
Ok(out)
}