Skip to main content

owl_structural_model/
class_restriction.rs

1//! Cardinality and data-property restriction constructors.
2use crate::ObjectPropertyExpression;
3use crate::{
4    Cardinality, ClassExpression, DataRange, OperandList, RDFS_LITERAL, StructuralModelError,
5};
6use iri_rfc3987::Iri;
7impl<L, B> ClassExpression<L, B> {
8    /// Create an object minimum cardinality restriction; no filler means owl:Thing.
9    #[must_use]
10    pub fn object_min_cardinality(
11        cardinality: Cardinality,
12        property: ObjectPropertyExpression,
13        filler: Option<Self>,
14    ) -> Self {
15        Self::ObjectMinCardinality {
16            cardinality,
17            property,
18            filler: Box::new(filler.unwrap_or_else(Self::thing)),
19        }
20    }
21    /// Create an object maximum cardinality restriction; no filler means owl:Thing.
22    #[must_use]
23    pub fn object_max_cardinality(
24        cardinality: Cardinality,
25        property: ObjectPropertyExpression,
26        filler: Option<Self>,
27    ) -> Self {
28        Self::ObjectMaxCardinality {
29            cardinality,
30            property,
31            filler: Box::new(filler.unwrap_or_else(Self::thing)),
32        }
33    }
34    /// Create an object exact cardinality restriction; no filler means owl:Thing.
35    #[must_use]
36    pub fn object_exact_cardinality(
37        cardinality: Cardinality,
38        property: ObjectPropertyExpression,
39        filler: Option<Self>,
40    ) -> Self {
41        Self::ObjectExactCardinality {
42            cardinality,
43            property,
44            filler: Box::new(filler.unwrap_or_else(Self::thing)),
45        }
46    }
47    /// Create a data some-values restriction with ordered property positions.
48    /// # Errors
49    /// Rejects an empty property list. Datatype arity is checked by semantic validators.
50    pub fn data_some_values_from(
51        properties: Vec<Iri<String>>,
52        range: DataRange<L>,
53    ) -> Result<Self, StructuralModelError> {
54        Ok(Self::DataSomeValuesFrom {
55            properties: OperandList::try_new(properties)?,
56            range,
57        })
58    }
59    /// Create a data all-values restriction with ordered property positions.
60    /// # Errors
61    /// Rejects an empty property list. Datatype arity is checked by semantic validators.
62    pub fn data_all_values_from(
63        properties: Vec<Iri<String>>,
64        range: DataRange<L>,
65    ) -> Result<Self, StructuralModelError> {
66        Ok(Self::DataAllValuesFrom {
67            properties: OperandList::try_new(properties)?,
68            range,
69        })
70    }
71    /// Create a data-value restriction without evaluating the literal.
72    #[must_use]
73    pub fn data_has_value(property: Iri<String>, value: L) -> Self {
74        Self::DataHasValue { property, value }
75    }
76    /// Create a data minimum cardinality restriction; no range means rdfs:Literal.
77    #[must_use]
78    pub fn data_min_cardinality(
79        cardinality: Cardinality,
80        property: Iri<String>,
81        range: Option<DataRange<L>>,
82    ) -> Self {
83        Self::DataMinCardinality {
84            cardinality,
85            property,
86            range: range.unwrap_or_else(|| DataRange::datatype(Self::builtin(RDFS_LITERAL))),
87        }
88    }
89    /// Create a data maximum cardinality restriction; no range means rdfs:Literal.
90    #[must_use]
91    pub fn data_max_cardinality(
92        cardinality: Cardinality,
93        property: Iri<String>,
94        range: Option<DataRange<L>>,
95    ) -> Self {
96        Self::DataMaxCardinality {
97            cardinality,
98            property,
99            range: range.unwrap_or_else(|| DataRange::datatype(Self::builtin(RDFS_LITERAL))),
100        }
101    }
102    /// Create a data exact cardinality restriction; no range means rdfs:Literal.
103    #[must_use]
104    pub fn data_exact_cardinality(
105        cardinality: Cardinality,
106        property: Iri<String>,
107        range: Option<DataRange<L>>,
108    ) -> Self {
109        Self::DataExactCardinality {
110            cardinality,
111            property,
112            range: range.unwrap_or_else(|| DataRange::datatype(Self::builtin(RDFS_LITERAL))),
113        }
114    }
115}