weavatrix-rust 2.14.3

Protocol-independent Rust repository intelligence: typed evidence graphs for impact, architecture, APIs, Git, search, and memory
Documentation
use super::model::{AppRecord, DomainRecord, LinkRecord, flows_to, node_key, port_kind};
use crate::language::yaml_doc::{self, Node};
use weavatrix_graph::{EdgeKind, NodeKind};

pub(super) fn collect(record: &mut AppRecord, edges: &[Node], path: &str, raw: &str) {
    for edge in edges {
        let Some(source) = edge.get("source").and_then(Node::as_str) else {
            continue;
        };
        let Some(target) = edge.get("target").and_then(Node::as_str) else {
            continue;
        };
        let source_port = edge
            .get("sourceHandle")
            .and_then(Node::as_str)
            .unwrap_or("source");
        let target_port = edge
            .get("targetHandle")
            .and_then(Node::as_str)
            .unwrap_or("target");
        let from = node_key(&record.key, source);
        let to = node_key(&record.key, target);
        let (start, end) = edge.range();
        let span = yaml_doc::span_for(path, raw, start, end);
        record.domains.push(DomainRecord {
            owner: from.clone(),
            name: format!("port:out:{source_port}"),
            kind: port_kind(),
            relation: EdgeKind::Contains,
            span: span.clone(),
        });
        record.domains.push(DomainRecord {
            owner: to.clone(),
            name: format!("port:in:{target_port}"),
            kind: port_kind(),
            relation: EdgeKind::Contains,
            span: span.clone(),
        });
        record.links.push(LinkRecord {
            from,
            to,
            kind: flows_to(),
            span: span.clone(),
            detail: format!("{source_port}->{target_port}"),
        });
        if edge
            .get("data")
            .and_then(|data| data.get("isInIteration"))
            .and_then(Node::as_bool)
            == Some(true)
            && let Some(iteration) = edge
                .get("data")
                .and_then(|data| data.get("iteration_id"))
                .and_then(Node::as_str)
        {
            record.domains.push(DomainRecord {
                owner: node_key(&record.key, source),
                name: format!("scope:iteration:{iteration}"),
                kind: NodeKind::Unknown,
                relation: EdgeKind::Contains,
                span,
            });
        }
    }
    for node in &record.nodes {
        if let Some(parent) = &node.parent {
            record.domains.push(DomainRecord {
                owner: node.key.clone(),
                name: format!("parent:{parent}"),
                kind: NodeKind::Unknown,
                relation: EdgeKind::Contains,
                span: node.span.clone(),
            });
        }
    }
}