compose_library/foundations/global_funcs/
assertions.rs

1use crate::foundations::ops::Comparison;
2use crate::diag::bail;
3use compose_library::{Value, Vm};
4use compose_library::diag::StrResult;
5use compose_macros::{func, scope};
6use ecow::EcoString;
7use compose_library::repr::Repr;
8
9#[func(scope)]
10pub fn assert(cond: bool, #[named] message: Option<EcoString>) -> StrResult<()> {
11    if !cond {
12        match message {
13            Some(msg) => bail!("assertion failed: {}", msg),
14            None => bail!("assertion failed"),
15        }
16    } else {
17        Ok(())
18    }
19}
20
21#[scope]
22impl assert {
23    #[func]
24    pub fn eq(vm: &dyn Vm, left: Value, right: Value, #[named] message: Option<EcoString>) -> StrResult<()> {
25        
26        if !left.equals(&right, vm.heap())? {
27            let l_repr = left.repr(vm);
28            let r_repr = right.repr(vm);
29            bail!(
30                "assertion `left == right` failed{}\n{:>7} = {l_repr}\n{:>7} = {r_repr}",
31                message.map(|msg| format!(": {}", msg)).unwrap_or_default(),
32                "left:",
33                "right:"
34            )
35        } else {
36            Ok(())
37        }
38    }
39
40    #[func]
41    pub fn ne(vm: &dyn Vm, left: Value, right: Value) -> StrResult<()> {
42        if left.equals(&right, vm.heap())? {
43            bail!(
44                "assertion `left != right` failed\n{:>7} = {left:?}\n{:>7} = {right:?}",
45                "left:",
46                "right:"
47            )
48        } else {
49            Ok(())
50        }
51    }
52}