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