Streaming Tree ARchive format
at rust-impl 71 lines 1.9 kB view raw
1use star::{StarItem, StarIterator}; 2use std::env; 3use std::fs::File; 4use std::io::BufReader; 5 6fn main() -> Result<(), Box<dyn std::error::Error>> { 7 let args: Vec<String> = env::args().collect(); 8 if args.len() != 2 { 9 eprintln!("Usage: star-debug <file.star>"); 10 std::process::exit(1); 11 } 12 13 let file = File::open(&args[1])?; 14 let reader = BufReader::new(file); 15 let iter = StarIterator::new(reader); 16 17 let mut nodes = 0; 18 let mut records = 0; 19 20 for item in iter.iter_tree() { 21 let item = item?; 22 match item { 23 StarItem::Commit(c) => { 24 println!("Commit:"); 25 println!(" DID: {}", c.did); 26 println!(" Rev: {}", c.rev); 27 println!(" Root: {:?}", c.data); 28 } 29 StarItem::Node(_n) => { 30 // print_node(&n); 31 nodes += 1; 32 } 33 StarItem::Record { .. } => { 34 // println!(" Record: key={}, cid={}", to_hex(&key), cid); 35 records += 1; 36 } 37 } 38 } 39 40 println!("Tree contained {nodes} nodes, {records} records."); 41 42 Ok(()) 43} 44 45// fn print_node(node: &StarMstNode) { 46// println!("Node:"); 47// if let Some(l) = node.l { 48// println!(" Left -> {}", l); 49// } 50// for (i, e) in node.e.iter().enumerate() { 51// print!(" Entry {}: key={}", i, to_hex(&e.k)); 52// if let Some(v) = e.v { 53// print!(", val={}", v); 54// } else { 55// print!(", val=(implicit)"); 56// } 57// if let Some(t) = e.t { 58// print!(", right->{}", t); 59// } 60// println!(); 61// } 62// } 63 64// fn to_hex(bytes: &[u8]) -> String { 65// let mut s = String::with_capacity(bytes.len() * 2); 66// for b in bytes { 67// use std::fmt::Write; 68// write!(&mut s, "{:02x}", b).unwrap(); 69// } 70// s 71// }