datalogic-rs 5.0.0

A fast, type-safe Rust implementation of JSONLogic for evaluating logical rules as JSON. Perfect for business rules engines and dynamic filtering in Rust applications.
Documentation
use crate::arena::{ContextStack, DataValue, truthy_arena};
use crate::{CompiledNode, Engine, Result};
use bumpalo::Bump;

#[inline]
pub(crate) fn evaluate_not<'a>(
    args: &'a [CompiledNode],
    ctx: &mut ContextStack<'a>,
    engine: &Engine,
    arena: &'a Bump,
) -> Result<&'a DataValue<'a>> {
    if args.is_empty() {
        return Ok(crate::arena::singletons::singleton_true());
    }
    let v = engine.dispatch_node(&args[0], ctx, arena)?;
    Ok(crate::arena::singletons::singleton_bool(!truthy_arena(
        v, engine,
    )))
}

#[inline]
pub(crate) fn evaluate_bool_cast<'a>(
    args: &'a [CompiledNode],
    ctx: &mut ContextStack<'a>,
    engine: &Engine,
    arena: &'a Bump,
) -> Result<&'a DataValue<'a>> {
    if args.is_empty() {
        return Ok(crate::arena::singletons::singleton_false());
    }
    let v = engine.dispatch_node(&args[0], ctx, arena)?;
    Ok(crate::arena::singletons::singleton_bool(truthy_arena(
        v, engine,
    )))
}

#[inline]
pub(crate) fn evaluate_and<'a>(
    args: &'a [CompiledNode],
    ctx: &mut ContextStack<'a>,
    engine: &Engine,
    arena: &'a Bump,
) -> Result<&'a DataValue<'a>> {
    if args.is_empty() {
        return Ok(crate::arena::singletons::singleton_null());
    }
    let mut last: &DataValue<'a> = crate::arena::singletons::singleton_true();
    for arg in args {
        let v = engine.dispatch_node(arg, ctx, arena)?;
        if !truthy_arena(v, engine) {
            return Ok(v);
        }
        last = v;
    }
    Ok(last)
}

#[inline]
pub(crate) fn evaluate_or<'a>(
    args: &'a [CompiledNode],
    ctx: &mut ContextStack<'a>,
    engine: &Engine,
    arena: &'a Bump,
) -> Result<&'a DataValue<'a>> {
    if args.is_empty() {
        return Ok(crate::arena::singletons::singleton_null());
    }
    let mut last: &DataValue<'a> = crate::arena::singletons::singleton_false();
    for arg in args {
        let v = engine.dispatch_node(arg, ctx, arena)?;
        if truthy_arena(v, engine) {
            return Ok(v);
        }
        last = v;
    }
    Ok(last)
}