use crate::model::base::{AbstractGml, AsAbstractGml, AsAbstractGmlMut};
#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
pub struct AbstractGeometry {
pub(crate) abstract_gml: AbstractGml,
srs_dimension: Option<u32>,
}
impl AbstractGeometry {
pub fn new(abstract_gml: AbstractGml) -> Self {
Self {
abstract_gml,
srs_dimension: None,
}
}
}
pub trait AsAbstractGeometry: AsAbstractGml {
fn abstract_geometry(&self) -> &AbstractGeometry;
fn srs_dimension(&self) -> Option<u32> {
self.abstract_geometry().srs_dimension
}
}
pub trait AsAbstractGeometryMut: AsAbstractGeometry + AsAbstractGmlMut {
fn abstract_geometry_mut(&mut self) -> &mut AbstractGeometry;
fn set_srs_dimension(&mut self, srs_dimension: Option<u32>) {
self.abstract_geometry_mut().srs_dimension = srs_dimension;
}
}
impl AsAbstractGeometry for AbstractGeometry {
fn abstract_geometry(&self) -> &AbstractGeometry {
self
}
}
impl AsAbstractGeometryMut for AbstractGeometry {
fn abstract_geometry_mut(&mut self) -> &mut AbstractGeometry {
self
}
}
#[doc(hidden)]
#[macro_export]
macro_rules! impl_abstract_geometry_traits {
($type:ty) => {
impl $crate::model::base::AsAbstractGml for $type {
fn abstract_gml(&self) -> &$crate::model::base::AbstractGml {
use $crate::model::geometry::AsAbstractGeometry;
&self.abstract_geometry().abstract_gml
}
}
impl $crate::model::base::AsAbstractGmlMut for $type {
fn abstract_gml_mut(&mut self) -> &mut $crate::model::base::AbstractGml {
use $crate::model::geometry::AsAbstractGeometryMut;
&mut self.abstract_geometry_mut().abstract_gml
}
}
};
}
impl_abstract_geometry_traits!(AbstractGeometry);