egml-core 0.0.2-alpha.3

Core primitives and operations for processing GML data.
Documentation
use crate::model::geometry::primitives::{
    AbstractGeometricPrimitive, AsAbstractGeometricPrimitive, AsAbstractGeometricPrimitiveMut,
};

#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
pub struct AbstractSolid {
    pub(crate) abstract_geometric_primitive: AbstractGeometricPrimitive,
}

impl AbstractSolid {
    pub fn new(abstract_geometric_primitive: AbstractGeometricPrimitive) -> Self {
        Self {
            abstract_geometric_primitive,
        }
    }
}

pub trait AsAbstractSolid: AsAbstractGeometricPrimitive {
    fn abstract_solid(&self) -> &AbstractSolid;
}

pub trait AsAbstractSolidMut: AsAbstractSolid + AsAbstractGeometricPrimitiveMut {
    fn abstract_solid_mut(&mut self) -> &mut AbstractSolid;
}

impl AsAbstractSolid for AbstractSolid {
    fn abstract_solid(&self) -> &AbstractSolid {
        self
    }
}

impl AsAbstractSolidMut for AbstractSolid {
    fn abstract_solid_mut(&mut self) -> &mut AbstractSolid {
        self
    }
}

#[macro_export]
macro_rules! impl_abstract_solid_traits {
    ($type:ty) => {
        $crate::impl_abstract_geometric_primitive_traits!($type);

        impl $crate::model::geometry::primitives::AsAbstractGeometricPrimitive for $type {
            fn abstract_geometric_primitive(
                &self,
            ) -> &$crate::model::geometry::primitives::AbstractGeometricPrimitive {
                use $crate::model::geometry::primitives::AsAbstractSolid;
                &self.abstract_solid().abstract_geometric_primitive
            }
        }

        impl $crate::model::geometry::primitives::AsAbstractGeometricPrimitiveMut for $type {
            fn abstract_geometric_primitive_mut(
                &mut self,
            ) -> &mut $crate::model::geometry::primitives::AbstractGeometricPrimitive {
                use $crate::model::geometry::primitives::AsAbstractSolidMut;
                &mut self.abstract_solid_mut().abstract_geometric_primitive
            }
        }
    };
}

impl_abstract_solid_traits!(AbstractSolid);