microcad_lang/eval/
body.rs1use microcad_lang_base::SrcReferrer;
5
6use crate::{eval::*, model::*, symbol::SymbolMap};
7
8impl 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}