hpkg 1.0.0

A native Rust crate to parse Haiku's binary package and repo formats
Documentation
extern crate hpkg;

use std::{env, process};
use hpkg::repository::Repository;

fn main() {
	let args: Vec<String> = env::args().collect();
	if args.len() != 2 {
		println!("usage: dump_hpkr <repository.hpkr>");
		process::exit(1);
	}

	let repo = match Repository::load(&args[1]) {
		Ok(o) => o,
		Err(e) => {
			println!("ERROR: {:?}", e);
			process::exit(1);
		}
	};

	println!("Repository Info");
	println!("  name:       {:?}", repo.info.name);
	println!("  vendor:     {:?}", repo.info.vendor);
	println!("  summary:    {:?}", repo.info.summary);
	println!("  identifier: {:?}", repo.info.identifier);
	println!("  base URL:   {:?}", repo.info.base_url);
	println!("  priority:   {:?}", repo.info.priority);
	println!("  arch:       {:?}", repo.info.architecture);
	println!("  licenses:   {} names, {} texts",
		repo.info.license_names.len(),
		repo.info.license_texts.len());

	println!("\nHeader");
	if let Some(ref h) = repo.header {
		println!("  version:        {}.{}", h.version, h.minor_version);
		println!("  total size:     {}", h.total_size);
		println!("  compression:    {}", h.heap_compression);
		println!("  heap:           {} compressed -> {} uncompressed",
			h.heap_size_compressed, h.heap_size_uncompressed);
	}

	println!("\nPackages ({})", repo.packages.len());
	if repo.packages.is_empty() {
		println!("  (none)");
	} else {
		for (i, pkg) in repo.packages.iter().enumerate() {
			let arch = pkg.architecture.as_deref().unwrap_or("-");
			let checksum = pkg.checksum.as_deref().unwrap_or("-");
			println!("  {:<4} {:<30} {:12} {}",
				if i < 999 { format!("{}.", i + 1) } else { String::new() },
				pkg.name.as_deref().unwrap_or("(unnamed)"),
				arch,
				if checksum.len() > 16 {
					format!("{}..", &checksum[..16])
				} else {
					checksum.to_string()
				}
			);
			if i >= 99 {
				println!("  ... and {} more", repo.packages.len() - 100);
				break;
			}
		}
	}
}