zstd-pure-rs 0.2.0

Pure-Rust port of the Zstandard (zstd) compression library
Documentation
use std::env;
use std::path::PathBuf;
use std::process::{Command, ExitCode};

fn main() -> ExitCode {
    let path = env::args().nth(1).expect("path");
    let level: i32 = env::args().nth(2).and_then(|s| s.parse().ok()).unwrap_or(3);
    let seconds: u32 = env::args().nth(3).and_then(|s| s.parse().ok()).unwrap_or(3);
    let zstd = upstream_zstd();

    let status = match Command::new(&zstd)
        .args(bench_args(level, seconds))
        .arg("--")
        .arg(&path)
        .status()
    {
        Ok(status) => status,
        Err(err) => {
            eprintln!("failed to run upstream zstd {:?}: {err}", zstd);
            return ExitCode::FAILURE;
        }
    };
    if !status.success() {
        eprintln!("upstream zstd benchmark failed with status {status}");
        return ExitCode::FAILURE;
    }
    ExitCode::SUCCESS
}

fn upstream_zstd() -> PathBuf {
    if let Ok(path) = env::var("ZSTD_BIN") {
        return PathBuf::from(path);
    }
    for path in ["zstd/programs/zstd", "zstd/zstd"] {
        let path = PathBuf::from(path);
        if path.is_file() {
            return path;
        }
    }
    PathBuf::from("zstd")
}

fn bench_args(level: i32, seconds: u32) -> Vec<String> {
    let mut args = Vec::new();
    if level < 0 {
        args.push(format!("--fast={}", level.unsigned_abs()));
        args.push("-b".to_string());
    } else {
        if level > 19 {
            args.push("--ultra".to_string());
        }
        args.push(format!("-b{level}"));
    }
    args.push(format!("-i{seconds}"));
    args
}