mica_std/
core.rs

1//! Core functions.
2
3use 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
57/// Loads the core library into the engine.
58pub 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}