use microcad_lang_base::SrcReferrer;
use crate::{eval::*, lower::ir, model::*, symbol::SymbolMap};
impl Eval<Value> for ir::Body {
fn eval(&self, context: &mut EvalContext) -> EvalResult<Value> {
context.scope(StackFrame::Body(SymbolMap::default()), |context| {
self.statements.eval(context)
})
}
}
impl Eval<Option<Model>> for ir::Body {
fn eval(&self, context: &mut EvalContext) -> EvalResult<Option<Model>> {
self.eval(context).map(Some)
}
}
impl Eval<Model> for ir::Body {
fn eval(&self, context: &mut EvalContext) -> EvalResult<Model> {
context.scope(StackFrame::Body(SymbolMap::default()), |context| {
Ok(ModelBuilder::new(Element::Group, self.src_ref())
.add_children(self.statements.eval(context)?)
.attributes(self.statements.eval(context)?)
.build())
})
}
}
impl Eval<Attributes> for ir::Body {
fn eval(&self, context: &mut EvalContext) -> EvalResult<Attributes> {
self.statements.eval(context)
}
}