use crate::ObjectPropertyExpression;
use crate::{
Cardinality, ClassExpression, DataRange, OperandList, RDFS_LITERAL, StructuralModelError,
};
use iri_rfc3987::Iri;
impl<L, B> ClassExpression<L, B> {
#[must_use]
pub fn object_min_cardinality(
cardinality: Cardinality,
property: ObjectPropertyExpression,
filler: Option<Self>,
) -> Self {
Self::ObjectMinCardinality {
cardinality,
property,
filler: Box::new(filler.unwrap_or_else(Self::thing)),
}
}
#[must_use]
pub fn object_max_cardinality(
cardinality: Cardinality,
property: ObjectPropertyExpression,
filler: Option<Self>,
) -> Self {
Self::ObjectMaxCardinality {
cardinality,
property,
filler: Box::new(filler.unwrap_or_else(Self::thing)),
}
}
#[must_use]
pub fn object_exact_cardinality(
cardinality: Cardinality,
property: ObjectPropertyExpression,
filler: Option<Self>,
) -> Self {
Self::ObjectExactCardinality {
cardinality,
property,
filler: Box::new(filler.unwrap_or_else(Self::thing)),
}
}
pub fn data_some_values_from(
properties: Vec<Iri<String>>,
range: DataRange<L>,
) -> Result<Self, StructuralModelError> {
Ok(Self::DataSomeValuesFrom {
properties: OperandList::try_new(properties)?,
range,
})
}
pub fn data_all_values_from(
properties: Vec<Iri<String>>,
range: DataRange<L>,
) -> Result<Self, StructuralModelError> {
Ok(Self::DataAllValuesFrom {
properties: OperandList::try_new(properties)?,
range,
})
}
#[must_use]
pub fn data_has_value(property: Iri<String>, value: L) -> Self {
Self::DataHasValue { property, value }
}
#[must_use]
pub fn data_min_cardinality(
cardinality: Cardinality,
property: Iri<String>,
range: Option<DataRange<L>>,
) -> Self {
Self::DataMinCardinality {
cardinality,
property,
range: range.unwrap_or_else(|| DataRange::datatype(Self::builtin(RDFS_LITERAL))),
}
}
#[must_use]
pub fn data_max_cardinality(
cardinality: Cardinality,
property: Iri<String>,
range: Option<DataRange<L>>,
) -> Self {
Self::DataMaxCardinality {
cardinality,
property,
range: range.unwrap_or_else(|| DataRange::datatype(Self::builtin(RDFS_LITERAL))),
}
}
#[must_use]
pub fn data_exact_cardinality(
cardinality: Cardinality,
property: Iri<String>,
range: Option<DataRange<L>>,
) -> Self {
Self::DataExactCardinality {
cardinality,
property,
range: range.unwrap_or_else(|| DataRange::datatype(Self::builtin(RDFS_LITERAL))),
}
}
}