Skip to main content

microcad_lang/eval/
body.rs

1// Copyright © 2025-2026 The µcad authors <info@microcad.xyz>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4use microcad_lang_base::SrcReferrer;
5
6use crate::{eval::*, model::*, symbol::SymbolMap};
7
8/// Evaluate the body into a value.
9impl Eval<Value> for Body {
10    fn eval(&self, context: &mut EvalContext) -> EvalResult<Value> {
11        context.scope(StackFrame::Body(SymbolMap::default()), |context| {
12            self.statements.eval(context)
13        })
14    }
15}
16
17impl Eval<Option<Model>> for Body {
18    fn eval(&self, context: &mut EvalContext) -> EvalResult<Option<Model>> {
19        self.eval(context).map(Some)
20    }
21}
22
23impl Eval<Models> for Body {
24    fn eval(&self, context: &mut EvalContext) -> EvalResult<Models> {
25        self.statements.eval(context)
26    }
27}
28
29impl Eval<Model> for Body {
30    fn eval(&self, context: &mut EvalContext) -> EvalResult<Model> {
31        context.scope(StackFrame::Body(SymbolMap::default()), |context| {
32            Ok(ModelBuilder::new(Element::Group, self.src_ref())
33                .add_children(self.statements.eval(context)?)?
34                .attributes(self.statements.eval(context)?)
35                .build())
36        })
37    }
38}
39
40impl Eval<Attributes> for Body {
41    fn eval(&self, context: &mut EvalContext) -> EvalResult<Attributes> {
42        self.statements.eval(context)
43    }
44}