use fastobo::ast as obo;
use fastobo::semantics::Identified;
use horned_owl::model::MutableOntology;
use horned_owl::model::Ontology;
use super::Context;
use super::IntoOwl;
use super::IntoOwlCtx;
use crate::constants::uri;
use crate::error::Error;
impl IntoOwl for obo::OboDoc {
fn prefixes(&self) -> curie::PrefixMapping {
let mut mapping = crate::obo_prefixes();
for clause in self.header() {
if let obo::HeaderClause::Idspace(prefix, url, _) = clause {
mapping.add_prefix(prefix.as_str(), url.as_str()).ok();
}
}
mapping
}
fn into_owl<O>(mut self) -> Result<O, Error>
where
O: Default + Ontology + MutableOntology,
{
self.assign_namespaces()?;
self.treat_xrefs();
let mut ctx = Context::from_obodoc(&self)?;
let mut ont = O::default();
if let Some(name) = self.header().iter().find_map(|c| match c {
obo::HeaderClause::Ontology(name) => Some(name),
_ => None,
}) {
let url = format!("{}{}.owl", uri::OBO, name);
ont.mut_id().iri = Some(ctx.build.iri(url));
if let Ok(dv) = self.header().data_version() {
let url = format!("{}{}/{}/{}.owl", uri::OBO, name, dv, name);
ont.mut_id().viri = Some(ctx.build.iri(url));
}
}
let header = std::mem::take(self.header_mut());
for axiom in header.into_owl(&mut ctx).into_iter() {
ont.insert(axiom);
}
let entities = std::mem::replace(self.entities_mut(), Default::default());
for entity in entities.into_iter() {
ctx.current_frame = entity.as_id().clone().into_owl(&mut ctx);
match entity {
obo::EntityFrame::Term(frame) => {
for axiom in frame.into_owl(&mut ctx) {
ont.insert(axiom);
}
}
obo::EntityFrame::Typedef(frame) => {
for axiom in frame.into_owl(&mut ctx) {
ont.insert(axiom);
}
}
_ => (), };
}
Ok(ont)
}
}