use crate::{ObjectPropertyExpression, StructuralModelError};
#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
#[serde(
try_from = "Vec<ObjectPropertyExpression>",
into = "Vec<ObjectPropertyExpression>"
)]
pub struct ObjectPropertyChain {
members: Vec<ObjectPropertyExpression>,
}
impl ObjectPropertyChain {
pub fn try_new(members: Vec<ObjectPropertyExpression>) -> Result<Self, StructuralModelError> {
if members.len() < 2 {
return Err(StructuralModelError::InvalidFormat {
kind: "object property chain",
value: members.len().to_string(),
message: "requires at least two object property expressions",
});
}
Ok(Self { members })
}
#[must_use]
pub fn as_slice(&self) -> &[ObjectPropertyExpression] {
&self.members
}
}
impl TryFrom<Vec<ObjectPropertyExpression>> for ObjectPropertyChain {
type Error = StructuralModelError;
fn try_from(members: Vec<ObjectPropertyExpression>) -> Result<Self, Self::Error> {
Self::try_new(members)
}
}
impl From<ObjectPropertyChain> for Vec<ObjectPropertyExpression> {
fn from(chain: ObjectPropertyChain) -> Self {
chain.members
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
pub enum SubObjectPropertyExpression {
Property(ObjectPropertyExpression),
Chain(ObjectPropertyChain),
}