Skip to main content

ecitygml_core/model/construction/
abstract_constructive_element.rs

1use crate::model::core::{
2    AbstractOccupiedSpace, AsAbstractOccupiedSpace, AsAbstractOccupiedSpaceMut,
3};
4
5#[derive(Debug, Clone, PartialEq)]
6pub struct AbstractConstructiveElement {
7    pub abstract_occupied_space: AbstractOccupiedSpace,
8    is_structural_element: Option<bool>,
9}
10
11impl AbstractConstructiveElement {
12    pub fn new(abstract_occupied_space: AbstractOccupiedSpace) -> Self {
13        Self {
14            abstract_occupied_space,
15            is_structural_element: None,
16        }
17    }
18}
19
20pub trait AsAbstractConstructiveElement: AsAbstractOccupiedSpace {
21    fn abstract_constructive_element(&self) -> &AbstractConstructiveElement;
22}
23
24pub trait AsAbstractConstructiveElementMut:
25    AsAbstractOccupiedSpaceMut + AsAbstractConstructiveElement
26{
27    fn abstract_constructive_element_mut(&mut self) -> &mut AbstractConstructiveElement;
28}
29
30impl AsAbstractConstructiveElement for AbstractConstructiveElement {
31    fn abstract_constructive_element(&self) -> &AbstractConstructiveElement {
32        self
33    }
34}
35
36impl AsAbstractConstructiveElementMut for AbstractConstructiveElement {
37    fn abstract_constructive_element_mut(&mut self) -> &mut AbstractConstructiveElement {
38        self
39    }
40}
41
42#[macro_export]
43macro_rules! impl_abstract_constructive_element_traits {
44    ($type:ty) => {
45        $crate::impl_abstract_occupied_space_traits!($type);
46
47        impl $crate::model::core::AsAbstractOccupiedSpace for $type {
48            fn abstract_occupied_space(&self) -> &$crate::model::core::AbstractOccupiedSpace {
49                use $crate::model::construction::AsAbstractConstructiveElement;
50                &self.abstract_constructive_element().abstract_occupied_space
51            }
52        }
53
54        impl $crate::model::core::AsAbstractOccupiedSpaceMut for $type {
55            fn abstract_occupied_space_mut(
56                &mut self,
57            ) -> &mut $crate::model::core::AbstractOccupiedSpace {
58                use $crate::model::construction::AsAbstractConstructiveElementMut;
59                &mut self
60                    .abstract_constructive_element_mut()
61                    .abstract_occupied_space
62            }
63        }
64    };
65}
66
67impl_abstract_constructive_element_traits!(AbstractConstructiveElement);