asar-rust 0.1.0

Rust port of @electron/asar — create and extract Electron ASAR archives
Documentation
use asar_rust::disk::write_filesystem;
use asar_rust::filesystem::Filesystem;
use std::collections::HashMap;
use std::fs;
use std::path::PathBuf;

fn setup_test_dir() -> PathBuf {
    let dir = std::env::temp_dir().join("asar-disk-test");
    let _ = fs::remove_dir_all(&dir);
    fs::create_dir_all(&dir).unwrap();
    dir
}

#[test]
fn test_write_and_read_back() {
    let dir = setup_test_dir();
    let src = dir.join("src");
    fs::create_dir_all(&src).unwrap();
    fs::write(src.join("hello.txt"), b"hello world").unwrap();

    let dest = dir.join("test.asar");

    let mut filesystem = Filesystem::new(&src);
    filesystem.insert_file(&src.join("hello.txt"), 11, false, false, None).unwrap();

    let files = vec![(src.join("hello.txt"), false)];
    let metadata = HashMap::new();

    write_filesystem(&dest, &filesystem, &files, &metadata).unwrap();

    assert!(dest.exists());
    let meta = fs::metadata(&dest).unwrap();
    assert!(meta.len() > 8 + 11); // 8-byte size pickle + header + file content

    let _ = fs::remove_dir_all(&dir);
}

#[test]
fn test_empty_file_in_archive() {
    let dir = setup_test_dir();
    let src = dir.join("src");
    fs::create_dir_all(&src).unwrap();
    fs::write(src.join("empty.txt"), b"").unwrap();

    let dest = dir.join("empty.asar");

    let mut filesystem = Filesystem::new(&src);
    filesystem.insert_file(&src.join("empty.txt"), 0, false, false, None).unwrap();

    let files = vec![(src.join("empty.txt"), false)];
    let metadata = HashMap::new();

    write_filesystem(&dest, &filesystem, &files, &metadata).unwrap();
    assert!(dest.exists());

    let _ = fs::remove_dir_all(&dir);
}