relay-knowledge 1.1.9

Graph-database-based knowledge graph project.
Documentation
mod calls;
mod detection;
mod key_values;
mod knowledge_map;
mod languages;
mod model;
mod source;

pub(super) use detection::{detect, manual_parse_status, recoverable_parse_error};
pub(super) use model::{ConfigFact, ConfigImport, ConfigRange, ConfigReference, ConfigValueKind};

pub(super) fn doc_comment_text<'a>(trimmed: &'a str, language_id: &str) -> Option<&'a str> {
    match language_id {
        "markdown" | "json" | "gomod" => None,
        "xml" => trimmed
            .strip_prefix("<!--")
            .and_then(|value| value.strip_suffix("-->"))
            .map(str::trim),
        "cmake" | "dockerfile" | "make" | "ninja" | "properties" | "toml" | "ini" | "yaml"
        | "starlark" => trimmed.strip_prefix('#').map(str::trim),
        "jinja2" | "gotemplate" => trimmed
            .strip_prefix("{#")
            .and_then(|value| value.strip_suffix("#}"))
            .map(str::trim),
        _ => None,
    }
}

pub(super) fn structured_facts(
    path: &str,
    language_id: &str,
    content: &str,
) -> (Vec<ConfigFact>, Vec<ConfigReference>) {
    let mut definitions = Vec::new();
    let mut references = Vec::new();
    match language_id {
        "xml" => languages::xml::facts(content, &mut definitions),
        "starlark" => languages::starlark::facts(path, content, &mut definitions, &mut references),
        "make" => languages::make::facts(content, &mut definitions, &mut references),
        "cmake" => languages::cmake::facts(content, &mut definitions, &mut references),
        "dockerfile" => languages::dockerfile::facts(content, &mut definitions, &mut references),
        "properties" | "toml" | "ini" | "yaml" | "json" => {
            key_values::facts(language_id, content, &mut definitions)
        }
        "gomod" => languages::go_mod::facts(content, &mut definitions, &mut references),
        "ninja" => languages::ninja::facts(content, &mut definitions, &mut references),
        "jinja2" => languages::jinja::facts(content, &mut definitions, &mut references),
        "gotemplate" => {
            languages::go_template::facts(path, content, &mut definitions, &mut references)
        }
        _ => {}
    }
    knowledge_map::facts(path, language_id, content, &mut definitions);

    for definition in &mut definitions {
        if definition.name.is_empty() {
            definition.name = path.to_owned();
        }
    }

    (definitions, references)
}

pub(super) fn structured_imports(
    path: &str,
    language_id: &str,
    content: &str,
) -> Vec<ConfigImport> {
    let mut imports = Vec::new();
    match language_id {
        "xml" => languages::xml::imports(content, &mut imports),
        "cmake" => languages::cmake::imports(path, content, &mut imports),
        "dockerfile" => languages::dockerfile::imports(content, &mut imports),
        "starlark" => languages::starlark::imports(content, &mut imports),
        "make" => languages::make::imports(content, &mut imports),
        "jinja2" => languages::jinja::imports(content, &mut imports),
        "gotemplate" => languages::go_template::imports(content, &mut imports),
        "ninja" => languages::ninja::imports(content, &mut imports),
        _ => {}
    }

    imports
}