rl_lang/interpreter/stdlib/debug/
assert.rs1use crate::{
2 interpreter::{evaluator::Evaluator, values::Value},
3 utils::{errors::Error, span::Span},
4};
5
6pub fn func(eval: &mut Evaluator, args: Vec<Value>, span: Span) -> Result<Value, Error> {
7 if args.is_empty() || args.len() > 2 {
8 return Err(eval.err(
9 format!("assert: expects 1 or 2 arguments, got {}", args.len()),
10 span,
11 ));
12 }
13
14 let cond = match &args[0] {
15 Value::Bool(b) => *b,
16 other => {
17 return Err(eval.err(
18 format!(
19 "assert: expects a bool condition, got {}",
20 other.type_name()
21 ),
22 span,
23 ));
24 }
25 };
26
27 if !cond {
28 let message = match args.get(1) {
29 Some(Value::String(s)) => s.clone(),
30 Some(other) => {
31 return Err(eval.err(
32 format!(
33 "assert: expects a string message, got {}",
34 other.type_name()
35 ),
36 span,
37 ));
38 }
39 None => "assertion failed".to_string(),
40 };
41 return Err(eval.err(message, span));
42 }
43
44 Ok(Value::Null)
45}