weavatrix-graph 0.6.3

Deterministic, evidence-carrying graph core for Weavatrix repository intelligence
Documentation
use std::{env, fs, time::Instant};
use weavatrix_graph::{EdgeKind, EvidenceKind, Graph, LegacyGraph};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut args = env::args().skip(1).peekable();
    if args.peek().is_none() {
        eprintln!("usage: legacy_check <graph.json>...");
        std::process::exit(2);
    }

    for path in args {
        let started = Instant::now();
        let source = fs::read_to_string(&path)?;
        let read_ms = started.elapsed().as_secs_f64() * 1000.0;
        let parse_started = Instant::now();
        let legacy: LegacyGraph = serde_json::from_str(&source)?;
        let parse_ms = parse_started.elapsed().as_secs_f64() * 1000.0;
        let legacy_nodes = legacy.nodes.len();
        let legacy_links = legacy.links.len();
        let convert_started = Instant::now();
        let graph: Graph = legacy.into_graph("weavatrix.legacy_check")?;
        let convert_ms = convert_started.elapsed().as_secs_f64() * 1000.0;
        let unique_edges = graph.edge_count();
        let method_edges = graph
            .edges()
            .iter()
            .filter(|edge| edge.kind == EdgeKind::Method)
            .count();
        let exact_lsp_edges = graph
            .edges()
            .iter()
            .filter(|edge| edge.provenance.evidence == EvidenceKind::ExactLsp)
            .count();
        let attributed_edges = graph
            .edges()
            .iter()
            .filter(|edge| !edge.attributes.is_empty())
            .count();

        println!(
            "{path}\tnodes={legacy_nodes}->{nodes}\tedges={legacy_links}->{edges}\tunique_edges={unique_edges}\tduplicate_edges={duplicate_edges}\tmethod={method_edges}\texact_lsp={exact_lsp_edges}\tattributed_edges={attributed_edges}\tread_ms={read_ms:.2}\tparse_ms={parse_ms:.2}\tconvert_ms={convert_ms:.2}\ttotal_ms={total_ms:.2}",
            nodes = graph.node_count(),
            edges = graph.edge_count(),
            duplicate_edges = legacy_links - unique_edges,
            total_ms = started.elapsed().as_secs_f64() * 1000.0,
        );
    }

    Ok(())
}