cargo-depgraph 1.4.0

Creates dependency graphs for cargo projects using `cargo metadata` and graphviz.
use std::{cell::Cell, collections::HashMap, rc::Rc};

use cargo_metadata::Package as MetaPackage;

use crate::graph::DepGraph;

pub(crate) fn set_name_stats(graph: &mut DepGraph) {
    let mut name_uses_map = HashMap::<String, Rc<Cell<u16>>>::new();
    for pkg in graph.node_weights_mut() {
        let name_uses = name_uses_map.entry(pkg.name.clone()).or_default().clone();
        name_uses.set(name_uses.get() + 1);

        pkg.name_uses = Some(name_uses);
    }
}

pub(crate) fn is_proc_macro(pkg: &MetaPackage) -> bool {
    let res = pkg.targets.iter().any(|t| t.kind.iter().any(|k| k == "proc-macro"));
    if res && pkg.targets.iter().any(|t| t.kind.iter().any(|k| k == "lib")) {
        eprintln!("enountered a crate that is both a regular library and a proc-macro");
    }

    res
}