#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum DefinitionStatus {
EquivalentTo,
SubtypeOf,
}
impl DefinitionStatus {
#[must_use]
pub const fn prefix(self) -> &'static str {
match self {
Self::EquivalentTo => "===",
Self::SubtypeOf => "<<<",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Expression {
pub definition_status: Option<DefinitionStatus>,
pub sub_expression: SubExpression,
}
impl Expression {
#[must_use]
pub const fn status(&self) -> DefinitionStatus {
match self.definition_status {
Some(status) => status,
None => DefinitionStatus::EquivalentTo,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SubExpression {
pub focus: Vec<ConceptReference>,
pub refinement: Option<Refinement>,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct ConceptReference {
pub concept_id: String,
pub term: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Refinement {
pub ungrouped: Vec<Attribute>,
pub groups: Vec<AttributeGroup>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AttributeGroup {
pub attributes: Vec<Attribute>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Attribute {
pub name: ConceptReference,
pub value: AttributeValue,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum AttributeValue {
Concept(ConceptReference),
Nested(Box<SubExpression>),
Text(String),
Number(String),
}