relay-knowledge 1.1.16

Graph-database-based knowledge graph project.
Documentation
use super::{
    DependencySeed, SeedInput, capture_xml_text,
    gradle_notation::{gradle_coordinate_parts, gradle_dependency_call},
    push_seed, strip_comment,
};

pub(super) fn parse_pom(content: &str, records: &mut Vec<DependencySeed>) {
    let mut in_dependency = false;
    let mut in_dependency_management = false;
    let mut start_line = 1usize;
    let mut group_id = None::<String>;
    let mut artifact_id = None::<String>;
    let mut version = None::<String>;
    let mut scope = None::<String>;
    let mut dep_type = None::<String>;
    for (index, line) in content.lines().enumerate() {
        let trimmed = line.trim();
        let closes_dependency_management = trimmed.contains("</dependencyManagement>");
        if trimmed.contains("<dependencyManagement>") {
            in_dependency_management = true;
        }
        if trimmed.contains("<dependency>") {
            in_dependency = true;
            start_line = index + 1;
            group_id = None;
            artifact_id = None;
            version = None;
            scope = None;
            dep_type = None;
        }
        if !in_dependency {
            if closes_dependency_management {
                in_dependency_management = false;
            }
            continue;
        }
        capture_xml_text(trimmed, "groupId", &mut group_id);
        capture_xml_text(trimmed, "artifactId", &mut artifact_id);
        capture_xml_text(trimmed, "version", &mut version);
        capture_xml_text(trimmed, "scope", &mut scope);
        capture_xml_text(trimmed, "type", &mut dep_type);
        if !trimmed.contains("</dependency>") {
            continue;
        }
        if let (Some(group_id), Some(artifact_id)) = (group_id.take(), artifact_id.take()) {
            let bom = in_dependency_management
                && dep_type.as_deref() == Some("pom")
                && scope.as_deref() == Some("import");
            if in_dependency_management && !bom {
                in_dependency = false;
                if closes_dependency_management {
                    in_dependency_management = false;
                }
                continue;
            }
            let package_name = format!("{group_id}:{artifact_id}");
            let dependency_group = if bom {
                "bom".to_owned()
            } else {
                scope.clone().unwrap_or_else(|| "compile".to_owned())
            };
            push_seed(
                records,
                SeedInput::new(
                    "maven",
                    "java",
                    package_name,
                    version.take(),
                    dependency_group.as_str(),
                    "pom.xml",
                    false,
                )
                .line(start_line)
                .excerpt(format!("{group_id}:{artifact_id}")),
            );
        }
        in_dependency = false;
        if closes_dependency_management {
            in_dependency_management = false;
        }
    }
}

pub(super) fn parse_gradle(content: &str, records: &mut Vec<DependencySeed>) {
    for (index, line) in content.lines().enumerate() {
        let trimmed = strip_comment(line, '/').trim();
        let Some((configuration, dependency)) = gradle_dependency_call(trimmed) else {
            continue;
        };
        let (group, artifact, version) = gradle_coordinate_parts(&dependency);
        let Some(group) = group else {
            continue;
        };
        let Some(artifact) = artifact else {
            continue;
        };
        let is_bom = trimmed.contains("platform(") || trimmed.contains("enforcedPlatform(");
        let dependency_group = if is_bom { "bom" } else { &configuration };
        push_seed(
            records,
            SeedInput::new(
                "gradle",
                "java",
                format!("{group}:{artifact}"),
                version,
                dependency_group,
                "build.gradle",
                false,
            )
            .line(index + 1)
            .excerpt(trimmed),
        );
    }
}