Skip to main content

ecitygml_core/model/construction/
abstract_construction.rs

1use crate::model::core::{
2    AbstractOccupiedSpace, AsAbstractOccupiedSpace, AsAbstractOccupiedSpaceMut, AsAbstractSpaceMut,
3};
4use chrono::NaiveDate;
5use nalgebra::Isometry3;
6
7#[derive(Debug, Clone, PartialEq)]
8pub struct AbstractConstruction {
9    pub abstract_occupied_space: AbstractOccupiedSpace,
10    date_of_construction: Option<NaiveDate>,
11    date_of_demolition: Option<NaiveDate>,
12}
13
14impl AbstractConstruction {
15    pub fn new(abstract_occupied_space: AbstractOccupiedSpace) -> Self {
16        Self {
17            abstract_occupied_space,
18            date_of_construction: None,
19            date_of_demolition: None,
20        }
21    }
22}
23
24pub trait AsAbstractConstruction: AsAbstractOccupiedSpace {
25    fn abstract_construction(&self) -> &AbstractConstruction;
26
27    fn date_of_construction(&self) -> Option<&NaiveDate> {
28        self.abstract_construction().date_of_construction.as_ref()
29    }
30
31    fn date_of_demolition(&self) -> Option<&NaiveDate> {
32        self.abstract_construction().date_of_demolition.as_ref()
33    }
34}
35
36pub trait AsAbstractConstructionMut: AsAbstractOccupiedSpaceMut + AsAbstractConstruction {
37    fn abstract_construction_mut(&mut self) -> &mut AbstractConstruction;
38
39    fn set_date_of_construction(&mut self, date_of_construction: Option<NaiveDate>) {
40        self.abstract_construction_mut().date_of_construction = date_of_construction;
41    }
42
43    fn set_date_of_demolition(&mut self, date_of_demolition: Option<NaiveDate>) {
44        self.abstract_construction_mut().date_of_demolition = date_of_demolition;
45    }
46
47    fn apply_transform(&mut self, m: &Isometry3<f64>) {
48        AsAbstractOccupiedSpaceMut::apply_transform(self, m);
49    }
50}
51
52impl AsAbstractConstruction for AbstractConstruction {
53    fn abstract_construction(&self) -> &AbstractConstruction {
54        self
55    }
56}
57
58impl AsAbstractConstructionMut for AbstractConstruction {
59    fn abstract_construction_mut(&mut self) -> &mut AbstractConstruction {
60        self
61    }
62}
63
64#[macro_export]
65macro_rules! impl_abstract_construction_traits {
66    ($type:ty) => {
67        $crate::impl_abstract_occupied_space_traits!($type);
68
69        impl $crate::model::core::AsAbstractOccupiedSpace for $type {
70            fn abstract_occupied_space(&self) -> &$crate::model::core::AbstractOccupiedSpace {
71                use $crate::model::construction::AsAbstractConstruction;
72                &self.abstract_construction().abstract_occupied_space
73            }
74        }
75
76        impl $crate::model::core::AsAbstractOccupiedSpaceMut for $type {
77            fn abstract_occupied_space_mut(
78                &mut self,
79            ) -> &mut $crate::model::core::AbstractOccupiedSpace {
80                use $crate::model::construction::AsAbstractConstructionMut;
81                &mut self.abstract_construction_mut().abstract_occupied_space
82            }
83        }
84    };
85}
86
87impl_abstract_construction_traits!(AbstractConstruction);