1use std::fmt;
4use std::fmt::Write;
5
6use mica_hl::{Arguments, Engine, MicaResultExt, Value};
7
8use crate::gc::load_gc;
9use crate::iterators::load_iterators;
10
11fn print(arguments: Arguments) {
12 for value in arguments.array() {
13 print!("{value}");
14 }
15 println!();
16}
17
18fn debug(arguments: Arguments) {
19 for (i, value) in arguments.array().iter().enumerate() {
20 if i > 0 {
21 print!("\t");
22 }
23 print!("{value:?}");
24 }
25 println!();
26}
27
28#[derive(Debug)]
29struct UserError(String);
30
31impl fmt::Display for UserError {
32 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
33 write!(f, "{}", self.0)
34 }
35}
36
37impl std::error::Error for UserError {}
38
39fn error(arguments: Arguments) -> Result<(), UserError> {
40 let mut message = String::new();
41 for value in arguments.array() {
42 write!(message, "{}", value).unwrap();
43 }
44 Err(UserError(message))
45}
46
47fn assert(condition: Value, message: Option<Value>) -> Result<Value, mica_hl::Error> {
48 if condition.is_falsy() {
49 let message =
50 message.map(|value| value.to_string()).unwrap_or_else(|| "assertion failed".to_owned());
51 Err(message).mica()
52 } else {
53 Ok(condition)
54 }
55}
56
57pub fn load_core(engine: &mut Engine) -> Result<(), mica_hl::Error> {
59 engine.add_function("print", print)?;
60 engine.add_function("debug", debug)?;
61 engine.add_function("error", error)?;
62 engine.add_function("assert", assert)?;
63
64 load_gc(engine)?;
65 load_iterators(engine)?;
66
67 Ok(())
68}