ergotree_interpreter/eval/
extract_id.rs

1use ergotree_ir::mir::extract_id::ExtractId;
2use ergotree_ir::mir::value::Value;
3
4use crate::eval::env::Env;
5use crate::eval::Context;
6use crate::eval::EvalError;
7use crate::eval::Evaluable;
8
9impl Evaluable for ExtractId {
10    fn eval<'ctx>(
11        &self,
12        env: &mut Env<'ctx>,
13        ctx: &Context<'ctx>,
14    ) -> Result<Value<'ctx>, EvalError> {
15        let input_v = self.input.eval(env, ctx)?;
16        match input_v {
17            Value::CBox(b) => {
18                let bytes: Vec<i8> = b.box_id().into();
19                Ok(bytes.into())
20            }
21            _ => Err(EvalError::UnexpectedValue(format!(
22                "Expected ExtractId input to be Value::CBox, got {0:?}",
23                input_v
24            ))),
25        }
26    }
27}
28
29#[allow(clippy::unwrap_used)]
30#[cfg(test)]
31mod tests {
32    use super::*;
33    use crate::eval::context::Context;
34    use crate::eval::tests::eval_out;
35    use ergotree_ir::mir::expr::Expr;
36    use ergotree_ir::mir::global_vars::GlobalVars;
37    use sigma_test_util::force_any_val;
38
39    #[test]
40    fn eval() {
41        let e: Expr = ExtractId {
42            input: Box::new(GlobalVars::SelfBox.into()),
43        }
44        .into();
45        let ctx = force_any_val::<Context>();
46        let bytes: Vec<i8> = ctx.self_box.box_id().into();
47        assert_eq!(eval_out::<Vec<i8>>(&e, &ctx), bytes);
48    }
49}