use iri_rfc3987::Iri;
use crate::StructuralModelError;
const KIND_CLASS_EXPRESSION_OPERANDS: &str = "class expression operands";
#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
pub enum ObjectPropertyExpression {
Named(Iri<String>),
InverseOf(Box<ObjectPropertyExpression>),
}
impl ObjectPropertyExpression {
#[must_use]
pub fn named(iri: Iri<String>) -> Self {
Self::Named(iri)
}
#[must_use]
pub fn inverse_of(property: Self) -> Self {
Self::InverseOf(Box::new(property))
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
pub enum ClassExpression {
Named(Iri<String>),
Thing,
Nothing,
ObjectIntersectionOf(Vec<Self>),
ObjectUnionOf(Vec<Self>),
ObjectComplementOf(Box<Self>),
ObjectSomeValuesFrom {
property: ObjectPropertyExpression,
filler: Box<Self>,
},
ObjectAllValuesFrom {
property: ObjectPropertyExpression,
filler: Box<Self>,
},
}
impl ClassExpression {
#[must_use]
pub fn named(iri: Iri<String>) -> Self {
Self::Named(iri)
}
pub fn object_intersection_of(operands: Vec<Self>) -> Result<Self, StructuralModelError> {
Self::require_operands(&operands)?;
Ok(Self::ObjectIntersectionOf(operands))
}
pub fn object_union_of(operands: Vec<Self>) -> Result<Self, StructuralModelError> {
Self::require_operands(&operands)?;
Ok(Self::ObjectUnionOf(operands))
}
#[must_use]
pub fn object_complement_of(operand: Self) -> Self {
Self::ObjectComplementOf(Box::new(operand))
}
#[must_use]
pub fn object_some_values_from(property: ObjectPropertyExpression, filler: Self) -> Self {
Self::ObjectSomeValuesFrom {
property,
filler: Box::new(filler),
}
}
#[must_use]
pub fn object_all_values_from(property: ObjectPropertyExpression, filler: Self) -> Self {
Self::ObjectAllValuesFrom {
property,
filler: Box::new(filler),
}
}
fn require_operands(operands: &[Self]) -> Result<(), StructuralModelError> {
if operands.is_empty() {
return Err(StructuralModelError::InvalidFormat {
kind: KIND_CLASS_EXPRESSION_OPERANDS,
value: "0".to_owned(),
message: "requires at least one operand",
});
}
Ok(())
}
}