Skip to main content

microcad_lang/eval/
init.rs

1// Copyright © 2024-2026 The µcad authors <info@microcad.xyz>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4use microcad_lang_base::PushDiag;
5
6use crate::{eval::*, model::*, syntax::*};
7
8impl InitDefinition {
9    /// Evaluate a call to the init definition
10    pub fn eval(&self, non_property_args: Tuple, context: &mut EvalContext) -> EvalResult<()> {
11        let model = context.get_model()?;
12        context.scope(StackFrame::Init(non_property_args.into()), |context| {
13            let _: Value = self.body.statements.eval(context)?;
14
15            if let Some(properties) = model.borrow().get_properties() {
16                let missing: IdentifierList = properties
17                    .iter()
18                    .filter(|(_, value)| value.is_invalid())
19                    .map(|(id, _)| id.clone())
20                    .collect();
21
22                if !missing.is_empty() {
23                    context.error(self, EvalError::BuildingPlanIncomplete(missing))?;
24                }
25            }
26
27            Ok(())
28        })
29    }
30}