microcad-lang 0.5.0

µcad language
Documentation
// Copyright © 2025-2026 The µcad authors <info@microcad.xyz>
// SPDX-License-Identifier: AGPL-3.0-or-later

use microcad_lang_base::SrcReferrer;

use crate::{eval::*, lower::ir, model::*, symbol::SymbolMap};

impl Eval for std::rc::Rc<ir::Source> {
    fn eval(&self, context: &mut EvalContext) -> EvalResult<Value> {
        context.scope(
            StackFrame::Source(self.id(), SymbolMap::default()),
            |context| self.statements.eval(context),
        )
    }
}

impl Eval<Model> for std::rc::Rc<ir::Source> {
    fn eval(&self, context: &mut EvalContext) -> EvalResult<Model> {
        context.scope(
            StackFrame::Source(self.id(), SymbolMap::default()),
            |context| {
                let model = ModelBuilder::new(Element::Group, self.src_ref())
                    .add_children(self.statements.eval(context)?)
                    .attributes(self.statements.eval(context)?)
                    .build();
                Ok(model)
            },
        )
    }
}