ecitygml_core/model/construction/
abstract_construction.rs1use 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);