ifc_classification/assignment/
classification.rs1use crate::assignment::{validate_assignment, AssociationSchema};
3use crate::view::{
4 borrowed_entity, optional_text, required_ref, required_refs, required_text, ClassificationView,
5};
6use crate::ClassificationResult;
7use ifc_model::EntityId;
8borrowed_entity!(ClassificationAssignment, "IFCRELASSOCIATESCLASSIFICATION");
9impl<'m> ClassificationAssignment<'m> {
10 pub fn global_id(self) -> ClassificationResult<&'m str> {
12 required_text(
13 "IFCRELASSOCIATESCLASSIFICATION",
14 self.id(),
15 self.entity(),
16 self.text_slot("GlobalId")?,
17 "GlobalId",
18 )
19 }
20 pub fn name(self) -> ClassificationResult<Option<&'m str>> {
22 optional_text(
23 "IFCRELASSOCIATESCLASSIFICATION",
24 self.id(),
25 self.entity(),
26 self.text_slot("Name")?,
27 "Name",
28 )
29 }
30 pub fn description(self) -> ClassificationResult<Option<&'m str>> {
32 optional_text(
33 "IFCRELASSOCIATESCLASSIFICATION",
34 self.id(),
35 self.entity(),
36 self.text_slot("Description")?,
37 "Description",
38 )
39 }
40 pub fn related_object_ids(self) -> ClassificationResult<Vec<EntityId>> {
42 required_refs(
43 "IFCRELASSOCIATESCLASSIFICATION",
44 self.id(),
45 self.entity(),
46 self.slot("RelatedObjects")?,
47 "RelatedObjects",
48 )
49 }
50 pub fn relating_classification_id(self) -> ClassificationResult<EntityId> {
52 required_ref(
53 "IFCRELASSOCIATESCLASSIFICATION",
54 self.id(),
55 self.entity(),
56 self.slot("RelatingClassification")?,
57 "RelatingClassification",
58 )
59 }
60}
61impl<'m> ClassificationView<'m> {
62 pub fn classification_assignments(
64 self,
65 ) -> impl Iterator<Item = ClassificationAssignment<'m>> + 'm {
66 self.model()
67 .of_type("IFCRELASSOCIATESCLASSIFICATION")
68 .map(move |(id, e)| ClassificationAssignment::from_known(id, e, self.release()))
69 }
70 pub fn classification_assignments_for(
72 self,
73 object: EntityId,
74 ) -> ClassificationResult<Vec<ClassificationAssignment<'m>>> {
75 if self.model().get(object).is_none() {
76 return Err(crate::ClassificationError::UnknownEntity { id: object });
77 }
78 let mut out = Vec::new();
79 for assignment in self.classification_assignments() {
80 let related = assignment.related_object_ids()?;
81 if related.contains(&object) {
82 let target = assignment.relating_classification_id()?;
83 validate_assignment(
84 self,
85 assignment.id(),
86 &related,
87 target,
88 AssociationSchema {
89 relation: "IFCRELASSOCIATESCLASSIFICATION",
90 target_attribute: "RelatingClassification",
91 },
92 )?;
93 out.push(assignment);
94 }
95 }
96 Ok(out)
97 }
98}