owl_structural_model/
property_chain.rs1use crate::{ObjectPropertyExpression, StructuralModelError};
4
5#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
11#[serde(
12 try_from = "Vec<ObjectPropertyExpression>",
13 into = "Vec<ObjectPropertyExpression>"
14)]
15pub struct ObjectPropertyChain {
16 members: Vec<ObjectPropertyExpression>,
18}
19
20impl ObjectPropertyChain {
21 pub fn try_new(members: Vec<ObjectPropertyExpression>) -> Result<Self, StructuralModelError> {
27 if members.len() < 2 {
28 return Err(StructuralModelError::InvalidFormat {
29 kind: "object property chain",
30 value: members.len().to_string(),
31 message: "requires at least two object property expressions",
32 });
33 }
34 Ok(Self { members })
35 }
36
37 #[must_use]
39 pub fn as_slice(&self) -> &[ObjectPropertyExpression] {
40 &self.members
41 }
42}
43
44impl TryFrom<Vec<ObjectPropertyExpression>> for ObjectPropertyChain {
45 type Error = StructuralModelError;
46
47 fn try_from(members: Vec<ObjectPropertyExpression>) -> Result<Self, Self::Error> {
48 Self::try_new(members)
49 }
50}
51
52impl From<ObjectPropertyChain> for Vec<ObjectPropertyExpression> {
53 fn from(chain: ObjectPropertyChain) -> Self {
54 chain.members
55 }
56}
57
58#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
60pub enum SubObjectPropertyExpression {
61 Property(ObjectPropertyExpression),
63 Chain(ObjectPropertyChain),
65}