Skip to main content

ifc_classification/assignment/
classification.rs

1//! Borrowed `Ifcrelassociatesclassification` association projection.
2use 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    /// The `GlobalId` of this `IfcRelAssociatesClassification`.
11    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    /// Optional `Name` of the association relationship.
21    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    /// Optional `Description` of the association relationship.
31    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    /// Ids of the `RelatedObjects` being classified; non-empty per schema.
41    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    /// Id of the `RelatingClassification` (an `IfcClassification` or `IfcClassificationReference`).
51    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    /// All `IfcRelAssociatesClassification` instances in the model.
63    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    /// Classification assignments naming `object` among their `RelatedObjects`, with the relating classification checked against `IfcClassificationSelect`; fails if `object` is unknown or a reference does not resolve.
71    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}