use crate::core::exec::{eval_to_string, ExecOutcome};
use crate::core::{Element, Expr};
use crate::error::Result;
use std::rc::Rc;
pub struct On {
pub expr: Expr,
pub body: Vec<Element>,
}
impl On {
pub fn new(expr: Expr, body: Vec<Element>) -> Self {
On { expr, body }
}
pub(crate) fn exec(&self, env: &mut crate::core::Environment) -> Result<ExecOutcome> {
let name = eval_to_string(env, &self.expr)?;
let mv = macro_from_body(name.clone(), self.body.clone());
env.get_current_namespace().put_macro(name, mv);
Ok(ExecOutcome::Done)
}
}
fn macro_from_body(name: String, body: Vec<Element>) -> Rc<crate::core::environment::MacroValue> {
let def = Rc::new(crate::core::MacroDef {
name,
is_function: false,
params: Vec::new(),
body,
namespace: None,
template_name: String::new(),
span: crate::span::Span::new(0, 0),
});
Rc::new(crate::core::environment::MacroValue {
def,
ns: std::rc::Weak::new(),
with_args: None,
})
}