use cel::common::ast::{CallExpr, Expr};
use walrus::{InstrSeqBuilder, ValType};
use crate::compiler::{
context::{CompilerContext, CompilerEnv},
expr::compile_expr,
};
pub fn compile_cel_bind(
call_expr: &CallExpr,
body: &mut InstrSeqBuilder,
env: &CompilerEnv,
ctx: &CompilerContext,
module: &mut walrus::Module,
) -> Result<(), anyhow::Error> {
if call_expr.args.len() != 3 {
anyhow::bail!(
"cel.bind() expects exactly 3 arguments (var, init, body), got {}",
call_expr.args.len()
);
}
let var_name = match &call_expr.args[0].expr {
Expr::Ident(name) => name.clone(),
_ => anyhow::bail!("cel.bind() first argument must be a simple identifier"),
};
compile_expr(&call_expr.args[1].expr, body, env, ctx, module)?;
let local = module.locals.add(ValType::I32);
body.local_set(local);
let child_ctx = ctx.with_local(var_name, local);
compile_expr(&call_expr.args[2].expr, body, env, &child_ctx, module)
}