use crate::v1_2::data_structures::data_structure::DataStructure;
use crate::v1_2::data_structures::representation::item::Item;
impl DataStructure {
#[must_use]
pub fn as_hierarchy(&self) -> Option<Item> {
match self {
Self::ItemList(structure) => structure.as_hierarchy().map(Item::Cluster),
Self::ItemSingle(structure) => Some(Item::Element(structure.as_hierarchy().clone())),
Self::ItemTable(structure) => structure.as_hierarchy().map(Item::Cluster),
Self::ItemTree(structure) => structure.as_hierarchy().map(Item::Cluster),
Self::History(_) => None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::v1_2::data_structures::history::event::Event;
use crate::v1_2::data_structures::history::history::History;
use crate::v1_2::data_structures::history::point_event::PointEvent;
use crate::v1_2::data_structures::item_structure::item_list::ItemList;
use crate::v1_2::data_structures::item_structure::item_single::ItemSingle;
use crate::v1_2::data_structures::item_structure::item_structure::ItemStructure;
use crate::v1_2::data_structures::item_structure::item_tree::ItemTree;
use crate::v1_2::data_structures::representation::element::Element;
use crate::v1_2::data_types::basic::data_value::DataValue;
use crate::v1_2::data_types::quantity::date_time::dv_date_time::DvDateTime;
use crate::v1_2::data_types::text::dv_text::{DvText, DvTextData};
fn text(value: &str) -> DvText {
DvText::DvText(DvTextData {
value: value.to_owned(),
hyperlink: None,
formatting: None,
mappings: None,
language: None,
encoding: None,
})
}
fn element(node_id: &str, name: &str) -> Element {
Element {
name: text(name),
archetype_node_id: node_id.to_owned(),
uid: None,
links: None,
archetype_details: None,
feeder_audit: None,
null_flavour: None,
value: Some(DataValue::DvText(text(name))),
null_reason: None,
}
}
fn list(items: Option<Vec<Element>>) -> DataStructure {
DataStructure::ItemList(ItemList {
name: text("list"),
archetype_node_id: "at0000".to_owned(),
uid: None,
links: None,
archetype_details: None,
feeder_audit: None,
items,
})
}
fn single() -> DataStructure {
DataStructure::ItemSingle(ItemSingle {
name: text("single"),
archetype_node_id: "at0000".to_owned(),
uid: None,
links: None,
archetype_details: None,
feeder_audit: None,
item: Box::new(element("at0001", "the element")),
})
}
fn empty_tree() -> DataStructure {
DataStructure::ItemTree(ItemTree {
name: text("tree"),
archetype_node_id: "at0000".to_owned(),
uid: None,
links: None,
archetype_details: None,
feeder_audit: None,
items: None,
})
}
fn history() -> DataStructure {
DataStructure::History(History {
name: text("history"),
archetype_node_id: "at0000".to_owned(),
uid: None,
links: None,
archetype_details: None,
feeder_audit: None,
origin: DvDateTime {
normal_status: None,
normal_range: None,
other_reference_ranges: None,
magnitude_status: None,
accuracy: None,
value: "2026-01-01T00:00:00Z".to_owned(),
},
period: None,
duration: None,
summary: None,
events: Some(vec![Event::PointEvent(PointEvent {
name: text("event"),
archetype_node_id: "at0001".to_owned(),
uid: None,
links: None,
archetype_details: None,
feeder_audit: None,
time: DvDateTime {
normal_status: None,
normal_range: None,
other_reference_ranges: None,
magnitude_status: None,
accuracy: None,
value: "2026-01-01T00:00:00Z".to_owned(),
},
state: None,
data: ItemStructure::ItemTree(Box::new(ItemTree {
name: text("tree"),
archetype_node_id: "at0002".to_owned(),
uid: None,
links: None,
archetype_details: None,
feeder_audit: None,
items: None,
})),
})]),
})
}
#[test]
fn each_item_structure_reports_its_own_hierarchy() {
let list = list(Some(vec![element("at0001", "systolic")]));
assert!(matches!(list.as_hierarchy(), Some(Item::Cluster(_))));
assert!(matches!(single().as_hierarchy(), Some(Item::Element(_))));
}
#[test]
fn an_empty_structure_has_no_hierarchy() {
assert!(list(None).as_hierarchy().is_none());
assert!(list(Some(Vec::new())).as_hierarchy().is_none());
assert!(empty_tree().as_hierarchy().is_none());
}
#[test]
fn a_history_has_no_specified_hierarchy() {
assert!(history().as_hierarchy().is_none());
}
}