microcad_lang/eval/
body.rs1use microcad_lang_base::SrcReferrer;
5
6use crate::{eval::*, lower::ir, model::*, symbol::SymbolMap};
7
8impl Eval<Value> for ir::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 ir::Body {
18 fn eval(&self, context: &mut EvalContext) -> EvalResult<Option<Model>> {
19 self.eval(context).map(Some)
20 }
21}
22
23impl Eval<Model> for ir::Body {
24 fn eval(&self, context: &mut EvalContext) -> EvalResult<Model> {
25 context.scope(StackFrame::Body(SymbolMap::default()), |context| {
26 Ok(ModelBuilder::new(Element::Group, self.src_ref())
27 .add_children(self.statements.eval(context)?)
28 .attributes(self.statements.eval(context)?)
29 .build())
30 })
31 }
32}
33
34impl Eval<Attributes> for ir::Body {
35 fn eval(&self, context: &mut EvalContext) -> EvalResult<Attributes> {
36 self.statements.eval(context)
37 }
38}