ecitygml-core 0.0.1-alpha.13

Core primitives and operations for processing CityGML data.
Documentation
use crate::model::core::{
    AbstractOccupiedSpace, AsAbstractOccupiedSpace, AsAbstractOccupiedSpaceMut, AsAbstractSpaceMut,
};
use chrono::{DateTime, FixedOffset};
use nalgebra::Isometry3;

#[derive(Debug, Clone, PartialEq)]
pub struct AbstractConstruction {
    pub abstract_occupied_space: AbstractOccupiedSpace,
    creation_date: Option<DateTime<FixedOffset>>,
    demolition_date: Option<DateTime<FixedOffset>>,
}

impl AbstractConstruction {
    pub fn new(abstract_occupied_space: AbstractOccupiedSpace) -> Self {
        Self {
            abstract_occupied_space,
            creation_date: None,
            demolition_date: None,
        }
    }
}

pub trait AsAbstractConstruction: AsAbstractOccupiedSpace {
    fn abstract_construction(&self) -> &AbstractConstruction;

    fn creation_date(&self) -> Option<&DateTime<FixedOffset>> {
        self.abstract_construction().creation_date.as_ref()
    }

    fn demolition_date(&self) -> Option<&DateTime<FixedOffset>> {
        self.abstract_construction().demolition_date.as_ref()
    }
}

pub trait AsAbstractConstructionMut: AsAbstractOccupiedSpaceMut + AsAbstractConstruction {
    fn abstract_construction_mut(&mut self) -> &mut AbstractConstruction;

    fn set_creation_date(&mut self, creation_date: Option<DateTime<FixedOffset>>) {
        self.abstract_construction_mut().creation_date = creation_date;
    }

    fn set_demolition_date(&mut self, demolition_date: Option<DateTime<FixedOffset>>) {
        self.abstract_construction_mut().demolition_date = demolition_date;
    }

    fn apply_transform(&mut self, m: &Isometry3<f64>) {
        AsAbstractOccupiedSpaceMut::apply_transform(self, m);
    }
}

impl AsAbstractConstruction for AbstractConstruction {
    fn abstract_construction(&self) -> &AbstractConstruction {
        self
    }
}

impl AsAbstractConstructionMut for AbstractConstruction {
    fn abstract_construction_mut(&mut self) -> &mut AbstractConstruction {
        self
    }
}

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

        impl $crate::model::core::AsAbstractOccupiedSpace for $type {
            fn abstract_occupied_space(&self) -> &$crate::model::core::AbstractOccupiedSpace {
                use $crate::model::construction::AsAbstractConstruction;
                &self.abstract_construction().abstract_occupied_space
            }
        }

        impl $crate::model::core::AsAbstractOccupiedSpaceMut for $type {
            fn abstract_occupied_space_mut(
                &mut self,
            ) -> &mut $crate::model::core::AbstractOccupiedSpace {
                use $crate::model::construction::AsAbstractConstructionMut;
                &mut self.abstract_construction_mut().abstract_occupied_space
            }
        }
    };
}

impl_abstract_construction_traits!(AbstractConstruction);