#![allow(clippy::module_name_repetitions)]
use crate::error::Result;
use crate::model::features::Featured;
use crate::model::literal::LiteralFactoryRef;
use field33_rdftk_iri_temporary_fork::IRIRef;
use field33_rdftk_names_temporary_fork::rdf;
use std::fmt::{Debug, Display, Formatter};
use std::hash::{Hash, Hasher};
use std::rc::Rc;
pub trait Statement: Debug + Featured {
fn subject(&self) -> &SubjectNodeRef;
fn set_subject(&mut self, subject: SubjectNodeRef);
fn predicate(&self) -> &IRIRef;
fn set_predicate(&mut self, predicate: IRIRef);
fn object(&self) -> &ObjectNodeRef;
fn set_object(&mut self, object: ObjectNodeRef);
fn factory(&self) -> StatementFactoryRef;
fn literal_factory(&self) -> LiteralFactoryRef;
fn is_nested(&self) -> bool {
self.subject().is_statement() || self.object().is_statement()
}
}
pub type StatementRef = Rc<dyn Statement>;
pub type StatementList = Vec<StatementRef>;
pub const BLANK_NODE_NAMESPACE: &str = "_";
pub fn reify_statement(
st: &StatementRef,
factory: &StatementFactoryRef,
) -> Result<(SubjectNodeRef, Vec<StatementRef>)> {
let mut statements: Vec<StatementRef> = Default::default();
let new_subject = factory.blank_subject();
statements.push(factory.statement(
new_subject.clone(),
rdf::a_type().clone(),
factory.named_object(rdf::statement().clone()),
)?);
if st.subject().is_statement() {
let nested = reify_statement(st.subject().as_statement().unwrap(), factory)?;
statements.extend(nested.1);
statements.push(factory.statement(
new_subject.clone(),
rdf::subject().clone(),
factory.subject_as_object(nested.0),
)?);
} else {
statements.push(factory.statement(
new_subject.clone(),
rdf::subject().clone(),
factory.subject_as_object(st.subject().clone()),
)?);
}
statements.push(factory.statement(
new_subject.clone(),
rdf::predicate().clone(),
factory.named_object(st.predicate().clone()),
)?);
if st.object().is_statement() {
let nested = reify_statement(st.object().as_statement().unwrap(), factory)?;
statements.extend(nested.1);
statements.push(factory.statement(
new_subject.clone(),
rdf::object().clone(),
factory.subject_as_object(nested.0),
)?);
} else {
statements.push(factory.statement(
new_subject.clone(),
rdf::object().clone(),
st.object().clone(),
)?);
}
Ok((new_subject, statements))
}
impl PartialEq<dyn Statement> for dyn Statement {
fn eq(&self, other: &dyn Statement) -> bool {
self.subject() == other.subject()
&& self.predicate() == other.predicate()
&& self.object() == other.object()
}
}
impl Eq for dyn Statement {}
impl Display for dyn Statement {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{} <{}> {}",
&self.subject().to_string(),
&self.predicate().to_string(),
&self.object().to_string(),
)
}
}
impl Hash for dyn Statement {
fn hash<H: Hasher>(&self, state: &mut H) {
self.subject().hash(state);
self.predicate().hash(state);
self.object().hash(state);
}
}
#[doc(hidden)]
mod factory;
pub use factory::*;
#[doc(hidden)]
mod subject;
pub use subject::*;
#[doc(hidden)]
mod predicate;
pub use predicate::*;
#[doc(hidden)]
mod object;
pub use object::*;