Skip to main content

ecitygml_core/model/construction/
abstract_filling_surface.rs

1use crate::model::construction::{DoorSurface, WindowSurface};
2use crate::model::core::{
3    AbstractThematicSurface, AsAbstractThematicSurface, AsAbstractThematicSurfaceMut,
4};
5
6#[derive(Debug, Clone, PartialEq)]
7pub struct AbstractFillingSurface {
8    pub(crate) abstract_thematic_surface: AbstractThematicSurface,
9}
10
11impl AbstractFillingSurface {
12    pub fn new(abstract_thematic_surface: AbstractThematicSurface) -> Self {
13        Self {
14            abstract_thematic_surface,
15        }
16    }
17}
18
19pub trait AsAbstractFillingSurface: AsAbstractThematicSurface {
20    fn abstract_filling_surface(&self) -> &AbstractFillingSurface;
21}
22
23pub trait AsAbstractFillingSurfaceMut:
24    AsAbstractThematicSurfaceMut + AsAbstractFillingSurface
25{
26    fn abstract_filling_surface_mut(&mut self) -> &mut AbstractFillingSurface;
27}
28
29impl AsAbstractFillingSurface for AbstractFillingSurface {
30    fn abstract_filling_surface(&self) -> &AbstractFillingSurface {
31        self
32    }
33}
34
35impl AsAbstractFillingSurfaceMut for AbstractFillingSurface {
36    fn abstract_filling_surface_mut(&mut self) -> &mut AbstractFillingSurface {
37        self
38    }
39}
40
41#[macro_export]
42macro_rules! impl_abstract_filling_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::AsAbstractFillingSurface;
49                &self.abstract_filling_surface().abstract_thematic_surface
50            }
51        }
52
53        impl $crate::model::core::AsAbstractThematicSurfaceMut for $type {
54            fn abstract_thematic_surface_mut(
55                &mut self,
56            ) -> &mut $crate::model::core::AbstractThematicSurface {
57                use $crate::model::construction::AsAbstractFillingSurfaceMut;
58                &mut self
59                    .abstract_filling_surface_mut()
60                    .abstract_thematic_surface
61            }
62        }
63    };
64}
65
66impl_abstract_filling_surface_traits!(AbstractFillingSurface);
67
68#[derive(Debug, Clone, PartialEq)]
69pub enum FillingSurfaceKind {
70    DoorSurface(DoorSurface),
71    WindowSurface(WindowSurface),
72}
73
74impl AsAbstractFillingSurface for FillingSurfaceKind {
75    fn abstract_filling_surface(&self) -> &AbstractFillingSurface {
76        match self {
77            FillingSurfaceKind::DoorSurface(surface) => surface.abstract_filling_surface(),
78            FillingSurfaceKind::WindowSurface(surface) => surface.abstract_filling_surface(),
79        }
80    }
81}
82
83impl AsAbstractFillingSurfaceMut for FillingSurfaceKind {
84    fn abstract_filling_surface_mut(&mut self) -> &mut AbstractFillingSurface {
85        match self {
86            FillingSurfaceKind::DoorSurface(surface) => surface.abstract_filling_surface_mut(),
87            FillingSurfaceKind::WindowSurface(surface) => surface.abstract_filling_surface_mut(),
88        }
89    }
90}
91
92impl_abstract_filling_surface_traits!(FillingSurfaceKind);