use libarchive2::{ArchiveMatch, ReadArchive};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let args: Vec<String> = std::env::args().collect();
if args.len() < 2 {
eprintln!("Usage: {} <archive_file>", args[0]);
eprintln!("\nThis example demonstrates filtering archive entries.");
eprintln!("It will show only .txt files from the archive.");
std::process::exit(1);
}
let archive_path = &args[1];
let mut archive = ReadArchive::open(archive_path)?;
println!("Reading archive: {}", archive_path);
println!();
let mut matcher = ArchiveMatch::new()?;
matcher.include_pattern("*.txt")?;
println!("Filtering for: *.txt files");
println!("{}", "=".repeat(60));
let mut matched_count = 0;
let mut total_count = 0;
while let Some(entry) = archive.next_entry()? {
total_count += 1;
let pathname = entry.pathname().unwrap_or_else(|| "<unknown>".to_string());
if matcher.matches(&entry)? {
matched_count += 1;
println!("✓ {}", pathname);
println!(" Type: {:?}", entry.file_type());
println!(" Size: {} bytes", entry.size());
if let Some(mtime) = entry.mtime() {
println!(" Modified: {:?}", mtime);
}
println!();
}
}
println!("{}", "=".repeat(60));
println!("Matched {} of {} entries", matched_count, total_count);
Ok(())
}