compression-rs 0.2.2

Safe Rust bindings for Apple's Compression and AppleArchive APIs on macOS
Documentation
mod common;

use common::{artifact_dir, path_string};
use compression::{AccessControlEntry, AceQualifierType, ArchiveFlags, EntryAclBlob, EntryXatBlob};
use std::env;
use std::fs;
use std::process::Command;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let artifact_dir = artifact_dir("aa-entry-blobs");
    let dir = path_string(&artifact_dir);
    let source_name = "source.txt";
    let target_name = "target.txt";
    let source_path = path_string(&artifact_dir.join(source_name));
    let target_path = path_string(&artifact_dir.join(target_name));
    fs::write(&source_path, b"blob source")?;
    fs::write(&target_path, b"blob target")?;

    Command::new("xattr")
        .args(["-w", "com.example.compression-rs", "example", &source_path])
        .status()?;

    let acl_entry = AccessControlEntry {
        tag: 1,
        perms: 1 << 1,
        flags: 0,
        qualifier_type: AceQualifierType::User,
        qualifier: env::var("USER")?.into_bytes(),
    };
    let mut acl = EntryAclBlob::new()?;
    acl.append_entry(&acl_entry)?;
    let xat = EntryXatBlob::from_path(&dir, source_name, ArchiveFlags::empty())?;
    if !acl.is_empty() {
        let encoded = acl.encoded_data()?;
        let decoded = EntryAclBlob::from_encoded_data(&encoded)?;
        decoded.apply_to_path(&dir, target_name, ArchiveFlags::REPLACE_ATTRIBUTES)?;
    }
    let encoded_xat = xat.encoded_data()?;
    let decoded_xat = EntryXatBlob::from_encoded_data(&encoded_xat)?;
    decoded_xat.apply_to_path(&dir, target_name, ArchiveFlags::REPLACE_ATTRIBUTES)?;

    println!(
        "acl_entries={} xattrs={}",
        acl.entry_count(),
        xat.entry_count()
    );
    println!("✅ AppleArchive ACL/XAT blob helpers OK");
    Ok(())
}