use crate::model::Quad;
use crate::rdfxml::parser::RdfXmlParser;
use crate::OxirsError;
use std::io::Read;
pub fn parse_rdfxml<R: Read>(
reader: R,
base_iri: Option<&str>,
lenient: bool,
) -> Result<Vec<Quad>, OxirsError> {
let mut parser = RdfXmlParser::new();
if let Some(base) = base_iri {
parser = parser
.with_base_iri(base)
.map_err(|e| OxirsError::Parse(format!("Invalid base IRI: {e}")))?;
}
if lenient {
parser = parser.lenient();
}
let mut quads = Vec::new();
for result in parser.for_reader(reader) {
match result {
Ok(triple) => {
quads.push(Quad::from_triple(triple));
}
Err(e) => {
if lenient {
tracing::warn!("RDF/XML parse error (ignored): {}", e);
continue;
} else {
return Err(OxirsError::Parse(format!("RDF/XML parse error: {e}")));
}
}
}
}
Ok(quads)
}