Skip to main content

ecitygml_core/model/construction/
abstract_construction_surface.rs

1use crate::model::construction::{GroundSurface, RoofSurface, WallSurface};
2use crate::model::core::{
3    AbstractThematicSurface, AsAbstractThematicSurface, AsAbstractThematicSurfaceMut,
4};
5
6#[derive(Debug, Clone, PartialEq)]
7pub struct AbstractConstructionSurface {
8    pub abstract_thematic_surface: AbstractThematicSurface,
9}
10
11impl AbstractConstructionSurface {
12    pub fn new(abstract_thematic_surface: AbstractThematicSurface) -> Self {
13        Self {
14            abstract_thematic_surface,
15        }
16    }
17}
18
19pub trait AsAbstractConstructionSurface: AsAbstractThematicSurface {
20    fn abstract_construction_surface(&self) -> &AbstractConstructionSurface;
21}
22
23pub trait AsAbstractConstructionSurfaceMut:
24    AsAbstractThematicSurfaceMut + AsAbstractThematicSurface
25{
26    fn abstract_construction_surface_mut(&mut self) -> &mut AbstractConstructionSurface;
27}
28
29impl AsAbstractConstructionSurface for AbstractConstructionSurface {
30    fn abstract_construction_surface(&self) -> &AbstractConstructionSurface {
31        self
32    }
33}
34
35impl AsAbstractConstructionSurfaceMut for AbstractConstructionSurface {
36    fn abstract_construction_surface_mut(&mut self) -> &mut AbstractConstructionSurface {
37        self
38    }
39}
40
41#[macro_export]
42macro_rules! impl_abstract_construction_surface_traits {
43    ($type:ty) => {
44        $crate::impl_abstract_thematic_surface_traits!($type);
45
46        impl $crate::model::core::AsAbstractThematicSurface for $type {
47            fn abstract_thematic_surface(&self) -> &$crate::model::core::AbstractThematicSurface {
48                use $crate::model::construction::AsAbstractConstructionSurface;
49                &self
50                    .abstract_construction_surface()
51                    .abstract_thematic_surface
52            }
53        }
54
55        impl $crate::model::core::AsAbstractThematicSurfaceMut for $type {
56            fn abstract_thematic_surface_mut(
57                &mut self,
58            ) -> &mut $crate::model::core::AbstractThematicSurface {
59                use $crate::model::construction::AsAbstractConstructionSurfaceMut;
60                &mut self
61                    .abstract_construction_surface_mut()
62                    .abstract_thematic_surface
63            }
64        }
65    };
66}
67
68impl_abstract_construction_surface_traits!(AbstractConstructionSurface);
69
70#[derive(Debug, Clone, PartialEq)]
71pub enum ConstructionSurfaceKind {
72    GroundSurface(GroundSurface),
73    RoofSurface(RoofSurface),
74    WallSurface(WallSurface),
75}
76
77impl AsAbstractConstructionSurface for ConstructionSurfaceKind {
78    fn abstract_construction_surface(&self) -> &AbstractConstructionSurface {
79        match self {
80            ConstructionSurfaceKind::GroundSurface(surface) => {
81                surface.abstract_construction_surface()
82            }
83            ConstructionSurfaceKind::RoofSurface(surface) => {
84                surface.abstract_construction_surface()
85            }
86            ConstructionSurfaceKind::WallSurface(surface) => {
87                surface.abstract_construction_surface()
88            }
89        }
90    }
91}
92
93impl AsAbstractConstructionSurfaceMut for ConstructionSurfaceKind {
94    fn abstract_construction_surface_mut(&mut self) -> &mut AbstractConstructionSurface {
95        match self {
96            ConstructionSurfaceKind::GroundSurface(surface) => {
97                surface.abstract_construction_surface_mut()
98            }
99            ConstructionSurfaceKind::RoofSurface(surface) => {
100                surface.abstract_construction_surface_mut()
101            }
102            ConstructionSurfaceKind::WallSurface(surface) => {
103                surface.abstract_construction_surface_mut()
104            }
105        }
106    }
107}
108
109impl_abstract_construction_surface_traits!(ConstructionSurfaceKind);