use crate::eval::functions::{check_arity_len, EvalCtx};
use crate::eval::evaluate_expr;
use crate::parser::ast::Expr;
use crate::types::{ErrorKind, Value};
pub fn iferror_fn(args: &[Expr], ctx: &mut EvalCtx<'_>) -> Value {
if let Some(err) = check_arity_len(args.len(), 1, 2) {
return err;
}
let val = evaluate_expr(&args[0], ctx);
if matches!(val, Value::Error(_)) {
if args.len() == 2 {
evaluate_expr(&args[1], ctx)
} else {
Value::Text(String::new())
}
} else {
val
}
}
pub fn ifna_fn(args: &[Expr], ctx: &mut EvalCtx<'_>) -> Value {
if let Some(err) = check_arity_len(args.len(), 1, 2) {
return err;
}
let val = evaluate_expr(&args[0], ctx);
if matches!(val, Value::Error(ErrorKind::NA)) {
if args.len() == 2 {
evaluate_expr(&args[1], ctx)
} else {
Value::Text(String::new())
}
} else {
val
}
}
#[cfg(test)]
mod tests;