use crate::model::abstract_object::{AbstractObject, AsAbstractObject, AsAbstractObjectMut};
use crate::model::base::Id;
use crate::model::basic_types::Code;
#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
pub struct AbstractGml {
pub abstract_object: AbstractObject,
id: Option<Id>,
names: Vec<Code>,
}
impl AbstractGml {
pub fn new() -> Self {
Self::default()
}
pub fn from_abstract_object(abstract_object: AbstractObject) -> Self {
Self {
abstract_object,
id: None,
names: Vec::new(),
}
}
pub fn with_id(id: Id) -> Self {
Self {
id: Some(id),
..Default::default()
}
}
pub fn with_optional_id(id: Option<Id>) -> Self {
Self {
id,
..Default::default()
}
}
}
pub trait AsAbstractGml: AsAbstractObject {
fn abstract_gml(&self) -> &AbstractGml;
fn id(&self) -> Option<&Id> {
self.abstract_gml().id.as_ref()
}
fn names(&self) -> &[Code] {
&self.abstract_gml().names
}
}
pub trait AsAbstractGmlMut: AsAbstractObjectMut + AsAbstractGml {
fn abstract_gml_mut(&mut self) -> &mut AbstractGml;
fn set_id(&mut self, id: Id) {
self.abstract_gml_mut().id = Some(id);
}
fn set_id_opt(&mut self, id: Option<Id>) {
self.abstract_gml_mut().id = id;
}
fn clear_id(&mut self) {
self.abstract_gml_mut().id = None;
}
fn set_names(&mut self, names: Vec<Code>) {
self.abstract_gml_mut().names = names;
}
fn push_name(&mut self, name: Code) {
self.abstract_gml_mut().names.push(name);
}
fn extend_names(&mut self, names: impl IntoIterator<Item = Code>) {
self.abstract_gml_mut().names.extend(names);
}
}
impl AsAbstractGml for AbstractGml {
fn abstract_gml(&self) -> &AbstractGml {
self
}
}
impl AsAbstractGmlMut for AbstractGml {
fn abstract_gml_mut(&mut self) -> &mut AbstractGml {
self
}
}
#[macro_export]
macro_rules! impl_abstract_gml_traits {
($type:ty) => {
impl $crate::model::AsAbstractObject for $type {
fn abstract_object(&self) -> &$crate::model::AbstractObject {
&<$type as $crate::model::base::AsAbstractGml>::abstract_gml(self).abstract_object
}
}
};
}
#[macro_export]
macro_rules! impl_abstract_gml_mut_traits {
($type:ty) => {
impl $crate::model::AsAbstractObjectMut for $type {
fn abstract_object_mut(&mut self) -> &mut $crate::model::AbstractObject {
&mut <$type as $crate::model::base::AsAbstractGmlMut>::abstract_gml_mut(self)
.abstract_object
}
}
};
}
impl_abstract_gml_traits!(AbstractGml);
impl_abstract_gml_mut_traits!(AbstractGml);