Skip to main content

egml_core/model/geometry/primitives/
abstract_curve.rs

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