6 releases (breaking)

0.6.0 Feb 27, 2023
0.5.0 Feb 27, 2023
0.4.0 Feb 27, 2023
0.3.0 Jan 21, 2023
0.1.0 Nov 28, 2022

#367 in Compression

Download history 183/week @ 2023-12-13 67/week @ 2023-12-20 130/week @ 2023-12-27 48/week @ 2024-01-03 189/week @ 2024-01-10 602/week @ 2024-01-17 182/week @ 2024-01-24 505/week @ 2024-01-31 520/week @ 2024-02-07 966/week @ 2024-02-14 450/week @ 2024-02-21 251/week @ 2024-02-28 403/week @ 2024-03-06 251/week @ 2024-03-13 279/week @ 2024-03-20 158/week @ 2024-03-27

1,108 downloads per month
Used in 2 crates

Apache-2.0

48KB
1K SLoC

Contains (ar library, 34KB) tests/fixtures/bare_ar, (Mach-o exe, 34KB) tests/expected/bare_ar/a.out, (Mach-o exe, 34KB) tests/expected/content_bare_ar/a.out, (ar library, 34KB) tests/fixtures/bare.ar, (Zip file, 1KB) tests/fixtures/bare_zip

Decompress

github crates.io docs.rs build status

A library that supports decompression of archives in multiple formats, inspired by ergonomics from Node's decompress.

  • Includes a default stack of decompressors supporting: zip, tar, tar.gz, tar.bz2, tar.xz, tar.zst (zstd compression), ar (Unix Archive)
  • Build your own decompressors and add them
  • Compose a custom stack (exclude compressors, respond to different file extensions)
  • Use cargo features to avoid compiling formats you don't need

Dependency

[dependencies]
decompress = "0.1.0"

Usage

Default use:

decompress::decompress(archive, to, &ExtractOpts::default());

Strip the first component of all paths in the archive (for when you have a wrapper folder you don't need):

decompress::decompress(archive, to, &ExtractOpts{ strip: 1 });

A micro optimization:

let decompressor = decompress::Decompress::default()
// use decompressor
// decompressor.decompress(...)

Build your own stack:

use regex::Regex;
let decompressor = decompress::Decompress::build(vec![decompressors::zip::Zip::build(Some(
    Regex::new(r".*").unwrap(),
))]);
// use decompressor
// decompressor.decompress(...)

It's also possible to filter unwanted files, similar to nodejs decompress

let decompressor = decompress::Decompress::default();
let res = decompressor.decompress(
    archive,
    to,
    &ExtractOptsBuilder::default()
        .strip(strip)
        .filter(|path| {
            if let Some(path) = path.to_str() {
            return path.ends_with("abc.sh");
            }
            false
        })
        .build()
        .unwrap(),
);

Mapping paths is also supported

let decompressor = decompress::Decompress::default();
let res = decompressor.decompress(
    archive,
    to,
    &ExtractOptsBuilder::default()
        .strip(strip)
        .map(|path| {
            let mut path = path.to_path_buf();
            path.set_file_name(format!(
                "abc-{}",
                path.file_name().unwrap().to_str().unwrap()
            ));
            path.into()
        })
        .build()
        .unwrap(),
);

Copyright

Copyright (c) 2022 @jondot. See LICENSE for further details.

Dependencies

~3–16MB
~189K SLoC