Skip to main content

rl_lang/interpreter/stdlib/debug/
assert_eq.rs

1use crate::{
2    interpreter::{
3        evaluator::Evaluator,
4        stdlib::{common::extract_string, debug::common::assert_eq_message},
5        values::Value,
6    },
7    utils::{errors::Error, span::Span},
8};
9
10pub fn func(eval: &mut Evaluator, args: Vec<Value>, span: Span) -> Result<Value, Error> {
11    if args.len() < 2 || args.len() > 3 {
12        return Err(eval.err(
13            format!("assert_eq: expects 2 or 3 arguments, got {}", args.len()),
14            span,
15        ));
16    }
17
18    let (a, b) = (&args[0], &args[1]);
19    if a != b {
20        let err = match assert_eq_message(a, b, args.get(2), "assert_eq", true) {
21            Value::Ok(k) => *k,
22            Value::Err(e) => *e,
23            _ => {
24                unreachable!()
25            }
26        };
27        let err_string = match extract_string(err, "assert_eq") {
28            Err(a) | Ok(a) => a,
29        };
30
31        return Err(eval.err(err_string, span));
32    }
33    Ok(Value::Null)
34}