ergotree_interpreter/eval/
bool_to_sigma.rs

1use ergotree_ir::mir::bool_to_sigma::BoolToSigmaProp;
2use ergotree_ir::mir::constant::TryExtractInto;
3use ergotree_ir::mir::value::Value;
4use ergotree_ir::sigma_protocol::sigma_boolean::SigmaBoolean;
5use ergotree_ir::sigma_protocol::sigma_boolean::SigmaProp;
6
7use crate::eval::env::Env;
8use crate::eval::Context;
9use crate::eval::EvalError;
10use crate::eval::Evaluable;
11
12impl Evaluable for BoolToSigmaProp {
13    fn eval<'ctx>(
14        &self,
15        env: &mut Env<'ctx>,
16        ctx: &Context<'ctx>,
17    ) -> Result<Value<'ctx>, EvalError> {
18        let input_v = self.input.eval(env, ctx)?;
19        let input_v_bool = input_v.try_extract_into::<bool>()?;
20        Ok((SigmaProp::new(SigmaBoolean::TrivialProp(input_v_bool))).into())
21    }
22}
23
24#[cfg(test)]
25#[allow(clippy::panic)]
26mod tests {
27    use super::*;
28    use crate::eval::tests::eval_out_wo_ctx;
29    use ergotree_ir::mir::expr::Expr;
30    use proptest::prelude::*;
31
32    proptest! {
33
34        #[test]
35        fn eval(b in any::<bool>()) {
36            let expr: Expr = BoolToSigmaProp {input: Expr::Const(b.into()).into()}.into();
37            let res = eval_out_wo_ctx::<SigmaProp>(&expr);
38            prop_assert_eq!(res, SigmaProp::new(SigmaBoolean::TrivialProp(b)));
39        }
40    }
41}