Skip to main content

egml_core/model/geometry/
abstract_geometry.rs

1use crate::model::base::{AbstractGml, AsAbstractGml, AsAbstractGmlMut};
2
3/// Base data shared by all GML geometry types (ISO 19136 ยง10.1.3.1).
4///
5/// Embeds [`AbstractGml`] and is in turn embedded by every concrete and
6/// abstract geometry.
7#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
8pub struct AbstractGeometry {
9    pub(crate) abstract_gml: AbstractGml,
10}
11
12impl AbstractGeometry {
13    /// Creates a new `AbstractGeometry` wrapping the provided GML base data.
14    pub fn new(abstract_gml: AbstractGml) -> Self {
15        Self { abstract_gml }
16    }
17}
18
19/// Object-safe read accessor for [`AbstractGeometry`] fields.
20pub trait AsAbstractGeometry: AsAbstractGml {
21    /// Returns a reference to the embedded [`AbstractGeometry`] base data.
22    fn abstract_geometry(&self) -> &AbstractGeometry;
23}
24
25/// Mutable companion to [`AsAbstractGeometry`].
26pub trait AsAbstractGeometryMut: AsAbstractGeometry + AsAbstractGmlMut {
27    /// Returns a mutable reference to the embedded [`AbstractGeometry`] base data.
28    fn abstract_geometry_mut(&mut self) -> &mut AbstractGeometry;
29}
30
31impl AsAbstractGeometry for AbstractGeometry {
32    fn abstract_geometry(&self) -> &AbstractGeometry {
33        self
34    }
35}
36
37impl AsAbstractGeometryMut for AbstractGeometry {
38    fn abstract_geometry_mut(&mut self) -> &mut AbstractGeometry {
39        self
40    }
41}
42
43#[doc(hidden)]
44#[macro_export]
45macro_rules! impl_abstract_geometry_traits {
46    ($type:ty) => {
47        impl $crate::model::base::AsAbstractGml for $type {
48            fn abstract_gml(&self) -> &$crate::model::base::AbstractGml {
49                use $crate::model::geometry::AsAbstractGeometry;
50                &self.abstract_geometry().abstract_gml
51            }
52        }
53
54        impl $crate::model::base::AsAbstractGmlMut for $type {
55            fn abstract_gml_mut(&mut self) -> &mut $crate::model::base::AbstractGml {
56                use $crate::model::geometry::AsAbstractGeometryMut;
57                &mut self.abstract_geometry_mut().abstract_gml
58            }
59        }
60    };
61}
62
63impl_abstract_geometry_traits!(AbstractGeometry);