relay-knowledge 1.1.10

Graph-database-based knowledge graph project.
Documentation
use std::collections::HashSet;

use super::{DependencySeed, SeedInput, push_seed, strip_comment};

pub(super) fn parse_go_mod(content: &str, records: &mut Vec<DependencySeed>) {
    let mut in_require_block = false;
    for (index, line) in content.lines().enumerate() {
        let trimmed = strip_comment(line, '/').trim();
        if trimmed == "require (" {
            in_require_block = true;
            continue;
        }
        if in_require_block && trimmed == ")" {
            in_require_block = false;
            continue;
        }
        let require_line = if let Some(rest) = trimmed.strip_prefix("require ") {
            rest
        } else if in_require_block {
            trimmed
        } else {
            continue;
        };
        let mut parts = require_line.split_whitespace();
        let Some(name) = parts.next() else {
            continue;
        };
        let version = parts.next().map(str::to_owned);
        if !name.contains('.') {
            continue;
        }
        push_seed(
            records,
            SeedInput::new(
                "go",
                "go",
                name.to_owned(),
                version,
                "require",
                "go.mod",
                false,
            )
            .line(index + 1)
            .excerpt(require_line),
        );
    }
}

pub(super) fn parse_go_sum(content: &str, records: &mut Vec<DependencySeed>) {
    let mut seen = HashSet::new();
    for (index, line) in content.lines().enumerate() {
        let mut parts = line.split_whitespace();
        let (Some(name), Some(version)) = (parts.next(), parts.next()) else {
            continue;
        };
        let version = version.strip_suffix("/go.mod").unwrap_or(version);
        if !name.contains('.') {
            continue;
        }
        if !seen.insert((name.to_owned(), version.to_owned())) {
            continue;
        }
        push_seed(
            records,
            SeedInput::new("go", "go", name.to_owned(), None, "locked", "go.sum", true)
                .resolved(Some(version.to_owned()))
                .line(index + 1)
                .excerpt(line.trim()),
        );
    }
}