use crate::eval::functions::{check_arity, check_arity_len, EvalCtx};
use crate::eval::evaluate_expr;
use crate::parser::ast::Expr;
use crate::types::{ErrorKind, Value};
pub fn isnumber_fn(args: &[Value]) -> Value {
if let Some(err) = check_arity(args, 1, 1) { return err; }
Value::Bool(matches!(args[0], Value::Number(_)))
}
pub fn istext_fn(args: &[Value]) -> Value {
if let Some(err) = check_arity(args, 1, 1) { return err; }
Value::Bool(matches!(args[0], Value::Text(_)))
}
pub fn iserror_fn(args: &[Value]) -> Value {
if let Some(err) = check_arity(args, 1, 1) { return err; }
Value::Bool(matches!(args[0], Value::Error(_)))
}
pub fn isblank_fn(args: &[Value]) -> Value {
if let Some(err) = check_arity(args, 1, 1) { return err; }
Value::Bool(matches!(args[0], Value::Empty))
}
pub fn isna_fn(args: &[Value]) -> Value {
if let Some(err) = check_arity(args, 1, 1) { return err; }
Value::Bool(matches!(args[0], Value::Error(ErrorKind::NA)))
}
pub fn isnumber_lazy_fn(args: &[Expr], ctx: &mut EvalCtx<'_>) -> Value {
if check_arity_len(args.len(), 1, 1).is_some() {
return Value::Error(ErrorKind::NA);
}
let val = evaluate_expr(&args[0], ctx);
Value::Bool(matches!(val, Value::Number(_)))
}
pub fn istext_lazy_fn(args: &[Expr], ctx: &mut EvalCtx<'_>) -> Value {
if check_arity_len(args.len(), 1, 1).is_some() {
return Value::Error(ErrorKind::NA);
}
let val = evaluate_expr(&args[0], ctx);
Value::Bool(matches!(val, Value::Text(_)))
}
pub fn iserror_lazy_fn(args: &[Expr], ctx: &mut EvalCtx<'_>) -> Value {
if check_arity_len(args.len(), 1, 1).is_some() {
return Value::Error(ErrorKind::NA);
}
let val = evaluate_expr(&args[0], ctx);
Value::Bool(matches!(val, Value::Error(_)))
}
pub fn isblank_lazy_fn(args: &[Expr], ctx: &mut EvalCtx<'_>) -> Value {
if check_arity_len(args.len(), 1, 1).is_some() {
return Value::Error(ErrorKind::NA);
}
let val = evaluate_expr(&args[0], ctx);
Value::Bool(matches!(val, Value::Empty))
}
pub fn isna_lazy_fn(args: &[Expr], ctx: &mut EvalCtx<'_>) -> Value {
if check_arity_len(args.len(), 1, 1).is_some() {
return Value::Error(ErrorKind::NA);
}
let val = evaluate_expr(&args[0], ctx);
Value::Bool(matches!(val, Value::Error(ErrorKind::NA)))
}
pub fn iserr_fn(args: &[Expr], ctx: &mut EvalCtx<'_>) -> Value {
if check_arity_len(args.len(), 1, 1).is_some() {
return Value::Error(ErrorKind::NA);
}
let val = evaluate_expr(&args[0], ctx);
let is_err = match &val {
Value::Error(e) => *e != ErrorKind::NA,
_ => false,
};
Value::Bool(is_err)
}
pub fn islogical_fn(args: &[Expr], ctx: &mut EvalCtx<'_>) -> Value {
if check_arity_len(args.len(), 1, 1).is_some() {
return Value::Error(ErrorKind::NA);
}
let val = evaluate_expr(&args[0], ctx);
Value::Bool(matches!(val, Value::Bool(_)))
}
pub fn isnontext_fn(args: &[Expr], ctx: &mut EvalCtx<'_>) -> Value {
if check_arity_len(args.len(), 1, 1).is_some() {
return Value::Error(ErrorKind::NA);
}
let val = evaluate_expr(&args[0], ctx);
Value::Bool(!matches!(val, Value::Text(_)))
}
#[cfg(test)]
mod tests;