mirror of
https://github.com/storytold/craft-libs.git
synced 2026-11-14 06:22:24 +00:00
feat(figcraft-format): expose archive compression modes
This commit is contained in:
1 parent
644e613b06
commit
f8acbd5832
2 files changed
+21
-3
No files matched your search
@@ -253,3 +253,6 @@ mod streaming_writer_tests {
|
||||
assert_eq!(value["format"], FORMAT);
|
||||
}
|
||||
}
|
||||
|
||||
/// ZIP compression modes for native archive members.
|
||||
pub use craft_zip::Compression;
|
||||
+18
-3
@@ -35,7 +35,19 @@ impl Writer {
|
||||
|
||||
/// Adds an entry from a byte slice. A name the archive already has is an error.
|
||||
pub fn add(&mut self, name: &str, data: &[u8], compression: Compression) -> Result<(), Error> {
|
||||
self.add_with(name, compression, |writer| writer.write_all(data))
|
||||
let (method, level) = match compression {
|
||||
Compression::Stored => (zip::CompressionMethod::Stored, None),
|
||||
Compression::Deflated => (zip::CompressionMethod::Deflated, Some(6)),
|
||||
Compression::Level(l) => (zip::CompressionMethod::Deflated, Some(i64::from(l.min(9)))),
|
||||
};
|
||||
let options = zip::write::SimpleFileOptions::default()
|
||||
.compression_method(method)
|
||||
.compression_level(level)
|
||||
.last_modified_time(zip::DateTime::default())
|
||||
.large_file(data.len() as u64 >= u64::from(u32::MAX) / 2);
|
||||
let fail = |e: &dyn std::fmt::Display| Error::Write(format!("{name}: {e}"));
|
||||
self.zip.start_file(name, options).map_err(|e| fail(&e))?;
|
||||
self.zip.write_all(data).map_err(|e| fail(&e))
|
||||
}
|
||||
|
||||
/// Adds an entry by streaming it into the compressor, so large generated entries need not
|
||||
@@ -46,8 +58,11 @@ impl Writer {
|
||||
Compression::Deflated => (zip::CompressionMethod::Deflated, Some(6)),
|
||||
Compression::Level(l) => (zip::CompressionMethod::Deflated, Some(i64::from(l.min(9)))),
|
||||
};
|
||||
let options =
|
||||
zip::write::SimpleFileOptions::default().compression_method(method).compression_level(level).last_modified_time(zip::DateTime::default());
|
||||
let options = zip::write::SimpleFileOptions::default()
|
||||
.compression_method(method)
|
||||
.compression_level(level)
|
||||
.last_modified_time(zip::DateTime::default())
|
||||
.large_file(true);
|
||||
let fail = |e: &dyn std::fmt::Display| Error::Write(format!("{name}: {e}"));
|
||||
self.zip.start_file(name, options).map_err(|e| fail(&e))?;
|
||||
write(&mut self.zip).map_err(|e| fail(&e))
|
||||
|
||||
Reference in new issue
Block a user