Skip to main content

egml_core/model/geometry/primitives/
abstract_surface.rs

1use crate::model::geometry::primitives::{
2    AbstractGeometricPrimitive, AsAbstractGeometricPrimitive, AsAbstractGeometricPrimitiveMut,
3};
4/// Base data shared by all GML surface geometry types ([OGC 07-036 ยง10.5.1](https://docs.ogc.org/is/07-036/07-036.pdf)).
5///
6/// A surface is a 2-D geometric primitive.  Concrete surface types include
7/// [`Polygon`], [`Surface`], and [`CompositeSurface`].
8#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
9pub struct AbstractSurface {
10    pub(crate) abstract_geometric_primitive: AbstractGeometricPrimitive,
11}
12
13impl AbstractSurface {
14    pub fn new(abstract_geometric_primitive: AbstractGeometricPrimitive) -> Self {
15        Self {
16            abstract_geometric_primitive,
17        }
18    }
19}
20
21/// Object-safe read accessor for [`AbstractSurface`] fields.
22pub trait AsAbstractSurface: AsAbstractGeometricPrimitive {
23    /// Returns a reference to the embedded [`AbstractSurface`] base data.
24    fn abstract_surface(&self) -> &AbstractSurface;
25}
26
27/// Mutable companion to [`AsAbstractSurface`].
28pub trait AsAbstractSurfaceMut: AsAbstractSurface + AsAbstractGeometricPrimitiveMut {
29    /// Returns a mutable reference to the embedded [`AbstractSurface`] base data.
30    fn abstract_surface_mut(&mut self) -> &mut AbstractSurface;
31}
32
33impl AsAbstractSurface for AbstractSurface {
34    fn abstract_surface(&self) -> &AbstractSurface {
35        self
36    }
37}
38
39impl AsAbstractSurfaceMut for AbstractSurface {
40    fn abstract_surface_mut(&mut self) -> &mut AbstractSurface {
41        self
42    }
43}
44
45#[doc(hidden)]
46#[macro_export]
47macro_rules! impl_abstract_surface_traits {
48    ($type:ty) => {
49        $crate::impl_abstract_geometric_primitive_traits!($type);
50
51        impl $crate::model::geometry::primitives::AsAbstractGeometricPrimitive for $type {
52            fn abstract_geometric_primitive(
53                &self,
54            ) -> &$crate::model::geometry::primitives::AbstractGeometricPrimitive {
55                use $crate::model::geometry::primitives::AsAbstractSurface;
56                &self.abstract_surface().abstract_geometric_primitive
57            }
58        }
59
60        impl $crate::model::geometry::primitives::AsAbstractGeometricPrimitiveMut for $type {
61            fn abstract_geometric_primitive_mut(
62                &mut self,
63            ) -> &mut $crate::model::geometry::primitives::AbstractGeometricPrimitive {
64                use $crate::model::geometry::primitives::AsAbstractSurfaceMut;
65                &mut self.abstract_surface_mut().abstract_geometric_primitive
66            }
67        }
68    };
69}
70
71impl_abstract_surface_traits!(AbstractSurface);