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