use microcad_lang_base::{Identifier, Refer};
use rustc_hash::FxHashMap;
use crate::{model::*, render::*};
#[derive(custom_debug::Debug, Default)]
pub struct ModelInner {
pub id: Option<Identifier>,
#[debug(skip)]
pub parent: Option<Model>,
pub children: Models,
pub assignments: FxHashMap<Identifier, Model>,
pub element: Refer<Element>,
pub attributes: Attributes,
pub output: Option<RenderOutput>,
}
impl ModelInner {
pub fn new(element: Element, src_ref: SrcRef) -> Self {
Self {
element: Refer::new(element, src_ref),
..Default::default()
}
}
pub fn clone_content(&self) -> Self {
Self {
id: self.id.clone(),
parent: None,
element: self.element.clone(),
attributes: self.attributes.clone(),
assignments: self.assignments.clone(),
output: self.output.clone(),
..Default::default()
}
}
pub fn children(&self) -> std::slice::Iter<'_, Model> {
self.children.iter()
}
pub fn is_empty(&self) -> bool {
self.children.is_empty()
}
pub fn element(&self) -> &Element {
&self.element
}
pub fn attributes(&self) -> &Attributes {
&self.attributes
}
pub fn output(&self) -> &RenderOutput {
self.output
.as_ref()
.expect("Render output. You have to pre-render() and render() the model first.")
}
pub fn output_mut(&mut self) -> &mut RenderOutput {
self.output
.as_mut()
.expect("Render output. You have to pre-render() and render() the model first.")
}
}
impl PropertiesAccess for ModelInner {
fn get_property(&self, id: &Identifier) -> Option<&Value> {
self.element.get_property(id)
}
fn set_property(&mut self, id: Identifier, value: Value) -> Option<Value> {
self.element.set_property(id, value)
}
fn get_properties(&self) -> Option<&Properties> {
self.element.get_properties()
}
fn add_properties(&mut self, props: Properties) {
self.element.add_properties(props);
}
}
impl SrcReferrer for ModelInner {
fn src_ref(&self) -> SrcRef {
self.element.src_ref.clone()
}
}