use crate::eval::functions::EvalCtx;
use crate::eval::evaluate_expr;
use crate::parser::ast::Expr;
use crate::types::{ErrorKind, Value};
pub fn switch_fn(args: &[Expr], ctx: &mut EvalCtx<'_>) -> Value {
if args.len() < 3 {
return Value::Error(ErrorKind::NA);
}
let expr_val = evaluate_expr(&args[0], ctx);
let rest = &args[1..];
let has_default = !rest.len().is_multiple_of(2);
let pairs_end = if has_default { rest.len() - 1 } else { rest.len() };
let mut i = 0;
while i < pairs_end {
let case_val = evaluate_expr(&rest[i], ctx);
if case_val == expr_val {
return evaluate_expr(&rest[i + 1], ctx);
}
i += 2;
}
if has_default {
evaluate_expr(&rest[rest.len() - 1], ctx)
} else {
Value::Error(ErrorKind::NA)
}
}
#[cfg(test)]
mod tests;