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);
let matched = match (&expr_val, &case_val) {
(Value::Text(a), Value::Text(b)) => a.to_uppercase() == b.to_uppercase(),
_ => case_val == expr_val,
};
if matched {
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;