compose_library/foundations/global_funcs/
assertions.rs1use 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}