use crate::Rudof;
use regex::Regex;
use std::collections::HashSet;
use std::sync::LazyLock;
pub(crate) enum PrefixDirective {
Turtle,
Sparql,
}
static TURTLE_PREFIX_DECL: LazyLock<Regex> = LazyLock::new(|| Regex::new(r"(?m)^\s*@prefix\s+([^\s:]*)\s*:").unwrap());
static SPARQL_PREFIX_DECL: LazyLock<Regex> = LazyLock::new(|| Regex::new(r"(?mi)^\s*PREFIX\s+([^\s:]*)\s*:").unwrap());
pub(crate) fn default_prefix_header(rudof: &Rudof, source: &str, directive: PrefixDirective) -> String {
let Some(defaults) = rudof.prefixes.as_ref() else {
return String::new();
};
if defaults.is_empty() {
return String::new();
}
let declared_regex = match directive {
PrefixDirective::Turtle => &*TURTLE_PREFIX_DECL,
PrefixDirective::Sparql => &*SPARQL_PREFIX_DECL,
};
let declared: HashSet<&str> = declared_regex
.captures_iter(source)
.map(|c| c.get(1).map_or("", |m| m.as_str()))
.collect();
let mut header = String::new();
for (alias, iri) in defaults.iter() {
if declared.contains(alias.as_str()) {
continue;
}
match directive {
PrefixDirective::Turtle => header.push_str(&format!("@prefix {alias}: <{iri}> .\n")),
PrefixDirective::Sparql => header.push_str(&format!("PREFIX {alias}: <{iri}>\n")),
}
}
header
}