1use crate::{Cardinality, ClassExpressionKind, DataRange, Individual, OperandList, OperandSet};
4use iri_rfc3987::Iri;
5
6#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
8#[serde(deny_unknown_fields)]
9pub enum ObjectPropertyExpression {
10 Named(Iri<String>),
12 InverseOf(Iri<String>),
14}
15impl ObjectPropertyExpression {
16 #[must_use]
18 pub fn named(iri: Iri<String>) -> Self {
19 Self::Named(iri)
20 }
21 #[must_use]
23 pub fn inverse_of(iri: Iri<String>) -> Self {
24 Self::InverseOf(iri)
25 }
26}
27
28#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
30#[serde(deny_unknown_fields)]
31pub enum ClassExpression<L = crate::OwlLiteral, B = crate::BlankNodeId> {
32 Named(Iri<String>),
34 ObjectIntersectionOf(OperandSet<Self, 2>),
36 ObjectUnionOf(OperandSet<Self, 2>),
38 ObjectComplementOf(Box<Self>),
40 ObjectOneOf(OperandSet<Individual<B>, 1>),
42 ObjectSomeValuesFrom {
44 property: ObjectPropertyExpression,
46 filler: Box<Self>,
48 },
49 ObjectAllValuesFrom {
51 property: ObjectPropertyExpression,
53 filler: Box<Self>,
55 },
56 ObjectHasValue {
58 property: ObjectPropertyExpression,
60 individual: Individual<B>,
62 },
63 ObjectHasSelf {
65 property: ObjectPropertyExpression,
67 },
68 ObjectMinCardinality {
70 cardinality: Cardinality,
72 property: ObjectPropertyExpression,
74 filler: Box<Self>,
76 },
77 ObjectMaxCardinality {
79 cardinality: Cardinality,
81 property: ObjectPropertyExpression,
83 filler: Box<Self>,
85 },
86 ObjectExactCardinality {
88 cardinality: Cardinality,
90 property: ObjectPropertyExpression,
92 filler: Box<Self>,
94 },
95 DataSomeValuesFrom {
97 properties: OperandList<Iri<String>, 1>,
99 range: DataRange<L>,
101 },
102 DataAllValuesFrom {
104 properties: OperandList<Iri<String>, 1>,
106 range: DataRange<L>,
108 },
109 DataHasValue {
111 property: Iri<String>,
113 value: L,
115 },
116 DataMinCardinality {
118 cardinality: Cardinality,
120 property: Iri<String>,
122 range: DataRange<L>,
124 },
125 DataMaxCardinality {
127 cardinality: Cardinality,
129 property: Iri<String>,
131 range: DataRange<L>,
133 },
134 DataExactCardinality {
136 cardinality: Cardinality,
138 property: Iri<String>,
140 range: DataRange<L>,
142 },
143}
144
145impl<L, B> ClassExpression<L, B> {
146 #[must_use]
148 pub fn kind(&self) -> ClassExpressionKind {
149 match self {
150 Self::Named(..) => ClassExpressionKind::Named,
151 Self::ObjectIntersectionOf(..) => ClassExpressionKind::ObjectIntersectionOf,
152 Self::ObjectUnionOf(..) => ClassExpressionKind::ObjectUnionOf,
153 Self::ObjectComplementOf(..) => ClassExpressionKind::ObjectComplementOf,
154 Self::ObjectOneOf(..) => ClassExpressionKind::ObjectOneOf,
155 Self::ObjectSomeValuesFrom { .. } => ClassExpressionKind::ObjectSomeValuesFrom,
156 Self::ObjectAllValuesFrom { .. } => ClassExpressionKind::ObjectAllValuesFrom,
157 Self::ObjectHasValue { .. } => ClassExpressionKind::ObjectHasValue,
158 Self::ObjectHasSelf { .. } => ClassExpressionKind::ObjectHasSelf,
159 Self::ObjectMinCardinality { .. } => ClassExpressionKind::ObjectMinCardinality,
160 Self::ObjectMaxCardinality { .. } => ClassExpressionKind::ObjectMaxCardinality,
161 Self::ObjectExactCardinality { .. } => ClassExpressionKind::ObjectExactCardinality,
162 Self::DataSomeValuesFrom { .. } => ClassExpressionKind::DataSomeValuesFrom,
163 Self::DataAllValuesFrom { .. } => ClassExpressionKind::DataAllValuesFrom,
164 Self::DataHasValue { .. } => ClassExpressionKind::DataHasValue,
165 Self::DataMinCardinality { .. } => ClassExpressionKind::DataMinCardinality,
166 Self::DataMaxCardinality { .. } => ClassExpressionKind::DataMaxCardinality,
167 Self::DataExactCardinality { .. } => ClassExpressionKind::DataExactCardinality,
168 }
169 }
170}