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