Skip to main content

rl_lang/interpreter/stdlib/debug/
assert.rs

1use 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}