Skip to main content

akar_function/scalar/
boolean.rs

1use crate::registry::*;
2use akar_common::types::Value;
3
4// ==================== Boolean ====================
5
6pub(crate) fn evaluate_boolean(op: BooleanOp, args: &[Value]) -> Result<Value, String> {
7    if args.len() < 2 && !matches!(op, BooleanOp::Not) {
8        return Err("Boolean op requires 2 arguments".into());
9    }
10    let a = match &args[0] {
11        Value::Bool(b) => *b,
12        _ => return Err("Expected boolean".into()),
13    };
14    match op {
15        BooleanOp::And => {
16            let b = match &args[1] {
17                Value::Bool(x) => *x,
18                _ => return Err("Expected boolean".into()),
19            };
20            Ok(Value::Bool(a && b))
21        }
22        BooleanOp::Or => {
23            let b = match &args[1] {
24                Value::Bool(x) => *x,
25                _ => return Err("Expected boolean".into()),
26            };
27            Ok(Value::Bool(a || b))
28        }
29        BooleanOp::Xor => {
30            let b = match &args[1] {
31                Value::Bool(x) => *x,
32                _ => return Err("Expected boolean".into()),
33            };
34            Ok(Value::Bool(a ^ b))
35        }
36        BooleanOp::Not => Ok(Value::Bool(!a)),
37    }
38}