use crate::{HeapTerm, QuadPattern, Term, TriplePattern};
pub trait StatementPattern {
type Term: Term + Clone;
fn matches(
&self,
subject: impl Term,
predicate: impl Term,
object: impl Term,
context: Option<impl Term>,
) -> bool {
if let Some(s) = self.subject() {
if s.value_str() != subject.value_str() {
return false;
}
}
if let Some(p) = self.predicate() {
if p.value_str() != predicate.value_str() {
return false;
}
}
if let Some(o) = self.object() {
if o.value_str() != object.value_str() {
return false;
}
}
if let Some(c) = self.context() {
if c.value_str() != context.unwrap().value_str() {
return false;
}
}
true
}
fn has_subject(&self) -> bool {
self.subject().is_some()
}
fn has_predicate(&self) -> bool {
self.predicate().is_some()
}
fn has_object(&self) -> bool {
self.object().is_some()
}
fn has_context(&self) -> bool {
self.context().is_some()
}
fn subject(&self) -> Option<&Self::Term> {
None
}
fn predicate(&self) -> Option<&Self::Term> {
None
}
fn object(&self) -> Option<&Self::Term> {
None
}
fn context(&self) -> Option<&Self::Term> {
None
}
fn to_triple_pattern(&self) -> TriplePattern<Self::Term> {
TriplePattern::new(
self.subject().cloned(),
self.predicate().cloned(),
self.object().cloned(),
)
}
fn to_quad_pattern(&self) -> QuadPattern<Self::Term> {
QuadPattern::new(
self.subject().cloned(),
self.predicate().cloned(),
self.object().cloned(),
self.context().cloned(),
)
}
}