Skip to main content

Crate cerniera

Crate cerniera 

Source
Expand description

A ZIP archive encoder that never copies your data.

Feed it file content through a Stream or write it directly with sendfile, mmap, or any I/O strategy you like - cerniera only encodes the ZIP framing around it.

Cerniera (/tʃerˈnjɛːra/) is Italian for zipper.

§Quick start

Feed a stream of ZipEntry items to ZipWriter and you get back a byte stream you can write to a file, use as an HTTP response body, or forward anywhere that accepts a Stream.

use std::{io, pin::pin};

use bytes::Bytes;
use cerniera::{FileTimes, MsDosDateTime, ZipEntry, ZipWriter};
use futures_util::{TryStreamExt, stream};
use tokio::{fs::File, io::AsyncWriteExt};

let modified = FileTimes::new(
    MsDosDateTime::new(2026, 3, 10, 12, 30, 0).unwrap(),
    1_773_145_800, // same instant, seconds since 1970-01-01 UTC
);

let entries = stream::iter([
    Ok(ZipEntry::file(
        "hello.txt".try_into().unwrap(),
        modified,
        stream::iter([Ok::<_, io::Error>(Bytes::from_static(b"Hello, world!"))]),
    )
    .unwrap()),
    Ok(ZipEntry::directory("subdir/".try_into().unwrap(), modified).unwrap()),
]);

let mut zip_stream = pin!(ZipWriter::new(entries));

let mut file = File::create("output.zip").await?;
while let Some(chunk) = zip_stream.try_next().await? {
    file.write_all(&chunk).await?;
}

§Two API levels

  • ZipWriter - high-level streaming builder. Give it entries, get a byte stream. Handles CRC-32 and all ZIP bookkeeping automatically. Files are stored (uncompressed).

  • ZipArchive - low-level, sans-IO encoder. Gives you full control over buffering and compression (DEFLATE, Zstandard, etc.) at the cost of a more manual lifecycle. See the deflate_zip and sendfile_zip examples.

§Features

  • std (default) - enables runtime SIMD detection for faster CRC-32.
  • jiff - adds TryFrom<jiff::civil::DateTime> for MsDosDateTime and TryFrom<jiff::Zoned> for FileTimes.

Re-exports§

pub use self::archive::CompressionMethod;
pub use self::archive::FileTimes;
pub use self::archive::InvalidFileTimes;
pub use self::archive::InvalidMsDosDateTime;
pub use self::archive::InvalidZipPath;
pub use self::archive::MsDosDateTime;
pub use self::archive::ZipArchive;
pub use self::archive::ZipPath;

Modules§

archive

Structs§

ZipEntry
One entry (file or directory) passed to ZipWriter.
ZipWriter
High-level streaming ZIP archive builder.