use guppy::{CargoMetadata, Error};
use std::{
collections::BTreeMap,
io::{Write, stdout},
};
fn main() -> Result<(), Error> {
let metadata =
CargoMetadata::parse_json(include_str!("../../fixtures/large/metadata_libra.json"))?;
let package_graph = metadata.build_graph()?;
let vm_metadata = package_graph
.workspace()
.member_by_path("language/vm/vm-runtime")
.expect("known workspace path");
let mut current = BTreeMap::new();
current.insert(vm_metadata.id(), vm_metadata);
let mut level = 0;
let stdout = stdout();
let mut f = stdout.lock();
while !current.is_empty() {
writeln!(f, "level {level}:").unwrap();
for (id, metadata) in ¤t {
writeln!(f, "* {}: {}", id, metadata.name()).unwrap();
}
writeln!(f).unwrap();
level += 1;
let next: BTreeMap<_, _> = current
.into_iter()
.flat_map(|(id, _)| {
let links = package_graph.metadata(id).expect("valid ID").direct_links();
links.map(|link| {
let to = link.to();
(to.id(), to)
})
})
.collect();
current = next;
}
Ok(())
}