ergotree_interpreter/eval/
bool_to_sigma.rs1use 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}