compose_library/foundations/global_funcs/
mod.rs

1use crate::diag::{bail, StrResult};
2use crate::Value;
3use compose_macros::func;
4use ecow::EcoString;
5use std::io::Write;
6
7mod assertions;
8
9pub use assertions::*;
10use compose_library::repr::Repr;
11use compose_library::vm::Vm;
12
13#[func]
14pub fn panic(msg: Value) -> StrResult<()> {
15    bail!("Panic: {:?}", msg)
16}
17
18#[func]
19pub fn print(vm: &mut dyn Vm, #[variadic] print_args: Vec<Value>) -> StrResult<()> {
20    vm.engine()
21        .world
22        .write(&|wtr: &mut dyn Write| write!(wtr, "{}", join_args(&print_args, vm)))
23        .map_err(|e| e.to_string().into())
24}
25#[func]
26pub fn println(vm: &mut dyn Vm, #[variadic] print_args: Vec<Value>) -> StrResult<()> {
27    vm.engine()
28        .world
29        .write(&|wtr: &mut dyn Write| writeln!(wtr, "{}", join_args(&print_args, vm)))
30        .map_err(|e| e.to_string().into())
31}
32
33fn join_args(args: &[Value], vm: &dyn Vm) -> EcoString {
34    let mut joined = EcoString::new();
35    for arg in args {
36        if !joined.is_empty() {
37            joined.push(' ');
38        }
39        joined.push_str(&arg.repr(vm));
40    }
41    joined
42}