LangelicArchive

Read ZIP, RAR, and 7z archives into memory from Elixir, backed by a Rustler NIF.

Backends: the zip crate, unrar (rarlab's vendored unrar C++ source — see NOTICE), and sevenz-rust2 (pure Rust).

Usage

{:ok, entries} = LangelicArchive.extract("comic.cbr")
# => [{"page_001.png", <<137, 80, ...>>}, ...]
{:ok, entries} = LangelicArchive.extract_binary(downloaded_bytes)
{:ok, listing} = LangelicArchive.list("book.7z")
# => [{"page_001.png", 482_113}, ...]
LangelicArchive.detect(<<"Rar!", 0x1A, 0x07, 0x01, 0x00, rest::binary>>)
# => :rar
LangelicArchive.extract("huge.zip", max_total_bytes: 100 * 1024 * 1024)
# => {:error, %LangelicArchive.Error{kind: :too_large}}

Password-protected archives fail with kind: :encrypted; bytes that are not a ZIP/RAR/7z fail with kind: :unrecognized_format. See LangelicArchive.Error for the full list.

Installation

def deps do
[
{:langelic_archive, "~> 0.1"}
]
end

Precompiled NIF binaries ship for macOS (arm64/x86_64) and Linux (arm64/x86_64 gnu, x86_64 musl) — no Rust toolchain needed. To force a source build (requires Rust and a C++ compiler for the unrar backend):

LANGELIC_ARCHIVE_BUILD=true mix deps.compile langelic_archive

Development

just test # full suite, NIF built from source
just check # every CI gate, locally
just release # interactive: bump, tag, push — CI builds and publishes

The first release has no prior tag: bump nothing, just git tag v0.1.0 && git push origin v0.1.0 and approve the hex environment when the workflow pauses. See UPDATE_PROCEDURE.md for the release mechanics and dependency-bump routine.

License

MIT, except the vendored unrar C++ source, which ships under rarlab's freeware unrar license (extraction only).