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 {
22 Self::Named(iri)
23 }
24
25 #[must_use]
27 pub fn inverse_of(property: Self) -> Self {
28 Self::InverseOf(Box::new(property))
29 }
30}
31
32#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
34pub enum ClassExpression {
35 Named(Iri<String>),
37 Thing,
39 Nothing,
41 ObjectIntersectionOf(Vec<Self>),
43 ObjectUnionOf(Vec<Self>),
45 ObjectComplementOf(Box<Self>),
47 ObjectSomeValuesFrom {
49 property: ObjectPropertyExpression,
51 filler: Box<Self>,
53 },
54 ObjectAllValuesFrom {
56 property: ObjectPropertyExpression,
58 filler: Box<Self>,
60 },
61}
62
63impl ClassExpression {
64 #[must_use]
66 pub fn named(iri: Iri<String>) -> Self {
67 Self::Named(iri)
68 }
69
70 pub fn object_intersection_of(operands: Vec<Self>) -> Result<Self, StructuralModelError> {
76 Self::require_operands(&operands)?;
77 Ok(Self::ObjectIntersectionOf(operands))
78 }
79
80 pub fn object_union_of(operands: Vec<Self>) -> Result<Self, StructuralModelError> {
86 Self::require_operands(&operands)?;
87 Ok(Self::ObjectUnionOf(operands))
88 }
89
90 #[must_use]
92 pub fn object_complement_of(operand: Self) -> Self {
93 Self::ObjectComplementOf(Box::new(operand))
94 }
95
96 #[must_use]
98 pub fn object_some_values_from(property: ObjectPropertyExpression, filler: Self) -> Self {
99 Self::ObjectSomeValuesFrom {
100 property,
101 filler: Box::new(filler),
102 }
103 }
104
105 #[must_use]
107 pub fn object_all_values_from(property: ObjectPropertyExpression, filler: Self) -> Self {
108 Self::ObjectAllValuesFrom {
109 property,
110 filler: Box::new(filler),
111 }
112 }
113
114 fn require_operands(operands: &[Self]) -> Result<(), StructuralModelError> {
115 if operands.is_empty() {
116 return Err(StructuralModelError::InvalidFormat {
117 kind: KIND_CLASS_EXPRESSION_OPERANDS,
118 value: "0".to_owned(),
119 message: "requires at least one operand",
120 });
121 }
122 Ok(())
123 }
124}