Streaming Tree ARchive format
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// }