owl_structural_model/
class_expression.rs1use iri_rfc3987::Iri;
4
5use crate::StructuralModelError;
6
7const KIND_CLASS_EXPRESSION_OPERANDS: &str = "class expression operands";
8
9#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
11pub enum ObjectPropertyExpression {
12 Named(Iri<String>),
14 InverseOf(Box<ObjectPropertyExpression>),
16}
17
18impl ObjectPropertyExpression {
19 #[must_use]
21 pub fn named(iri: Iri<String>) -> Self { Self::Named(iri) }
22
23 #[must_use]
25 pub fn inverse_of(property: Self) -> Self { Self::InverseOf(Box::new(property)) }
26}
27
28#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
30pub enum ClassExpression {
31 Named(Iri<String>),
33 Thing,
35 Nothing,
37 ObjectIntersectionOf(Vec<Self>),
39 ObjectUnionOf(Vec<Self>),
41 ObjectComplementOf(Box<Self>),
43 ObjectSomeValuesFrom {
45 property: ObjectPropertyExpression,
47 filler: Box<Self>,
49 },
50 ObjectAllValuesFrom {
52 property: ObjectPropertyExpression,
54 filler: Box<Self>,
56 },
57}
58
59impl ClassExpression {
60 #[must_use]
62 pub fn named(iri: Iri<String>) -> Self { Self::Named(iri) }
63
64 pub fn object_intersection_of(operands: Vec<Self>) -> Result<Self, StructuralModelError> {
70 Self::require_operands(&operands)?;
71 Ok(Self::ObjectIntersectionOf(operands))
72 }
73
74 pub fn object_union_of(operands: Vec<Self>) -> Result<Self, StructuralModelError> {
80 Self::require_operands(&operands)?;
81 Ok(Self::ObjectUnionOf(operands))
82 }
83
84 #[must_use]
86 pub fn object_complement_of(operand: Self) -> Self { Self::ObjectComplementOf(Box::new(operand)) }
87
88 #[must_use]
90 pub fn object_some_values_from(property: ObjectPropertyExpression, filler: Self) -> Self {
91 Self::ObjectSomeValuesFrom { property, filler: Box::new(filler) }
92 }
93
94 #[must_use]
96 pub fn object_all_values_from(property: ObjectPropertyExpression, filler: Self) -> Self {
97 Self::ObjectAllValuesFrom { property, filler: Box::new(filler) }
98 }
99
100 fn require_operands(operands: &[Self]) -> Result<(), StructuralModelError> {
101 if operands.is_empty() {
102 return Err(StructuralModelError::InvalidFormat {
103 kind: KIND_CLASS_EXPRESSION_OPERANDS,
104 value: "0".to_owned(),
105 message: "requires at least one operand",
106 });
107 }
108 Ok(())
109 }
110}
111