microcad_lang/model/
inner.rs1use rustc_hash::FxHashMap;
7
8use crate::{model::*, render::*, src_ref::*, syntax::*};
9
10pub enum ModelRenderState {
12 Pending,
15 Preparing,
18 Complete,
20}
21
22#[derive(custom_debug::Debug, Default)]
24pub struct ModelInner {
25 pub id: Option<Identifier>,
29 #[debug(skip)]
31 pub parent: Option<Model>,
32 pub children: Models,
34 pub assignments: FxHashMap<Identifier, Model>,
36 pub element: Refer<Element>,
38 pub attributes: Attributes,
40 pub output: Option<RenderOutput>,
42}
43
44impl ModelInner {
45 pub fn new(element: Element, src_ref: SrcRef) -> Self {
47 Self {
48 element: Refer::new(element, src_ref),
49 ..Default::default()
50 }
51 }
52
53 pub fn render_state(&self) -> ModelRenderState {
55 match &self.output {
56 Some(output) => match output.geometry {
57 Some(_) => ModelRenderState::Complete,
58 None => ModelRenderState::Preparing,
59 },
60 None => ModelRenderState::Pending,
61 }
62 }
63
64 pub fn clone_content(&self) -> Self {
66 Self {
67 id: self.id.clone(),
68 parent: None,
69 element: self.element.clone(),
70 attributes: self.attributes.clone(),
71 assignments: self.assignments.clone(),
72 output: self.output.clone(),
73 ..Default::default()
74 }
75 }
76
77 pub fn children(&self) -> std::slice::Iter<'_, Model> {
79 self.children.iter()
80 }
81
82 pub fn is_empty(&self) -> bool {
84 self.children.is_empty()
85 }
86
87 pub fn element(&self) -> &Element {
89 &self.element
90 }
91
92 pub fn attributes(&self) -> &Attributes {
94 &self.attributes
95 }
96
97 pub fn output(&self) -> &RenderOutput {
99 self.output
100 .as_ref()
101 .expect("Render output. You have to pre-render() and render() the model first.")
102 }
103
104 pub fn output_mut(&mut self) -> &mut RenderOutput {
106 self.output
107 .as_mut()
108 .expect("Render output. You have to pre-render() and render() the model first.")
109 }
110}
111
112impl PropertiesAccess for ModelInner {
113 fn get_property(&self, id: &Identifier) -> Option<&Value> {
114 self.element.get_property(id)
115 }
116
117 fn set_property(&mut self, id: Identifier, value: Value) -> Option<Value> {
118 self.element.set_property(id, value)
119 }
120
121 fn get_properties(&self) -> Option<&Properties> {
122 self.element.get_properties()
123 }
124
125 fn add_properties(&mut self, props: Properties) {
126 self.element.add_properties(props);
127 }
128}
129
130impl SrcReferrer for ModelInner {
131 fn src_ref(&self) -> SrcRef {
132 self.element.src_ref.clone()
133 }
134}