From b3fe098de581987ced20190a5478d6d0882654b2 Mon Sep 17 00:00:00 2001 From: Joseph O'Brien <98370624+89jobrien@users.noreply.github.com> Date: Thu, 2 Apr 2026 02:25:57 -0400 Subject: [PATCH] feat(notgraph): implement crate_graph collector --- crates/notgraph/src/crate_graph.rs | 49 ++++++++++++++++++++++++++++++ crates/notgraph/src/lib.rs | 1 + 2 files changed, 50 insertions(+) create mode 100644 crates/notgraph/src/crate_graph.rs diff --git a/crates/notgraph/src/crate_graph.rs b/crates/notgraph/src/crate_graph.rs new file mode 100644 index 0000000..bc17514 --- /dev/null +++ b/crates/notgraph/src/crate_graph.rs @@ -0,0 +1,49 @@ +use crate::types::{CrateGraph, CrateName}; +use anyhow::Result; + +pub fn build(manifest_path: &std::path::Path) -> Result { + let meta = cargo_metadata::MetadataCommand::new() + .manifest_path(manifest_path) + .no_deps() + .exec()?; + + let workspace_members: std::collections::HashSet = meta + .workspace_members + .iter() + .filter_map(|id| meta.packages.iter().find(|p| &p.id == id)) + .map(|p| p.name.clone()) + .collect(); + + let nodes: Vec = workspace_members.iter().cloned().collect(); + + let mut edges: Vec<(CrateName, CrateName)> = Vec::new(); + for pkg in meta.packages.iter().filter(|p| workspace_members.contains(&p.name)) { + for dep in &pkg.dependencies { + if workspace_members.contains(&dep.name) { + edges.push((pkg.name.clone(), dep.name.clone())); + } + } + } + + Ok(CrateGraph { nodes, edges }) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn builds_crate_graph_for_workspace() { + let manifest = std::path::Path::new(env!("CARGO_MANIFEST_DIR")) + .parent().unwrap() + .parent().unwrap() + .join("Cargo.toml"); + + let graph = build(&manifest).unwrap(); + + assert!(graph.nodes.contains(&"notgraph".to_string())); + assert!(graph.nodes.contains(&"notcore".to_string())); + assert!(graph.edges.contains(&("notstrap".to_string(), "notfiles".to_string()))); + assert!(!graph.edges.iter().any(|(from, _)| from == "notcore")); + } +} diff --git a/crates/notgraph/src/lib.rs b/crates/notgraph/src/lib.rs index cd40856..02a3c82 100644 --- a/crates/notgraph/src/lib.rs +++ b/crates/notgraph/src/lib.rs @@ -1 +1,2 @@ +pub mod crate_graph; pub mod types;