compose_library/foundations/global_funcs/
assertions.rs

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