k2f_docx 0.2.2

K2F lock → DOCX exporter
Documentation
use crate::DocxError;
use std::collections::BTreeMap;
use std::io::{Cursor, Write};
use zip::write::SimpleFileOptions;
use zip::{CompressionMethod, DateTime, ZipWriter};

pub fn write_deterministic_zip(files: &BTreeMap<String, Vec<u8>>) -> Result<Vec<u8>, DocxError> {
    let mut cursor = Cursor::new(Vec::new());
    {
        let mut zip = ZipWriter::new(&mut cursor);
        let time = DateTime::from_date_and_time(1980, 1, 1, 0, 0, 0)
            .map_err(|e| DocxError::Write(format!("zip timestamp: {e}")))?;
        let options = SimpleFileOptions::default()
            .compression_method(CompressionMethod::Deflated)
            .last_modified_time(time);
        for (name, bytes) in files {
            zip.start_file(name, options)
                .map_err(|e| DocxError::Write(format!("zip start {name}: {e}")))?;
            zip.write_all(bytes)
                .map_err(|e| DocxError::Write(format!("zip write {name}: {e}")))?;
        }
        zip.finish()
            .map_err(|e| DocxError::Write(format!("zip finish: {e}")))?;
    }
    Ok(cursor.into_inner())
}