crate::ix!();
pub type WorkspaceDependencyGraph = DiGraph<String, ()>;
#[async_trait]
impl<P,H:CrateHandleInterface<P>> GenerateDependencyTree for Workspace<P,H>
where for<'async_trait> P: From<PathBuf> + AsRef<Path> + Send + Sync + 'async_trait
{
type Tree = WorkspaceDependencyGraph;
type Error = WorkspaceError;
async fn generate_dependency_tree(&self) -> Result<WorkspaceDependencyGraph, WorkspaceError> {
let metadata = self.get_cargo_metadata().await?;
let mut graph: WorkspaceDependencyGraph = DiGraph::new();
let mut id_to_node: HashMap<PackageId, NodeIndex> = HashMap::new();
for package in metadata.packages {
let node = graph.add_node(package.name.clone());
id_to_node.insert(package.id.clone(), node);
}
if let Some(resolve) = &metadata.resolve {
for node in &resolve.nodes {
let package_node = id_to_node[&node.id];
for dep in &node.deps {
if let Some(dep_node) = id_to_node.get(&dep.pkg) {
graph.add_edge(package_node, *dep_node, ());
}
}
}
}
println!("dependency tree: {:#?}", graph);
Ok(graph)
}
async fn generate_dependency_tree_dot(&self) -> Result<String, WorkspaceError> {
let graph = self.generate_dependency_tree().await?;
let dot = Dot::with_config(&graph, &[DotConfig::EdgeNoLabel]);
Ok(format!("{:?}", dot))
}
}