json-eval-rs 0.0.116

High-performance JSON Logic evaluator with schema validation and dependency tracking. Built on blazing-fast Rust engine.
Documentation
use indexmap::IndexMap;
use serde_json::Value;
use std::sync::Arc;

pub(crate) fn extract_from_params(
    params: &mut serde_json::Map<String, Value>,
) -> IndexMap<String, Arc<Value>> {
    let mut static_arrays = IndexMap::new();
    extract_recursive(params, "/$params", &mut static_arrays, false);
    static_arrays
}

fn extract_recursive(
    map: &mut serde_json::Map<String, Value>,
    prefix: &str,
    static_arrays: &mut IndexMap<String, Arc<Value>>,
    inside_evaluation: bool,
) {
    // Find large static arrays.
    for (key, child) in map.iter_mut() {
        let path = format!("{}/{}", prefix, key);
        let child_inside_evaluation = inside_evaluation || key == "$evaluation";

        if let Value::Array(arr) = child {
            // Do not extract JSON Logic arguments.
            if !child_inside_evaluation
                && arr.len() > 10
                && !crate::parse_schema::common::has_actionable_keys(child)
            {
                let marker = Value::Object(
                    serde_json::json!({ "$static_array": path })
                        .as_object()
                        .unwrap()
                        .clone(),
                );
                let array_val = std::mem::replace(child, marker);
                static_arrays.insert(path, Arc::new(array_val));
            }
        } else if let Value::Object(child_map) = child {
            // Continue through nested objects.
            extract_recursive(child_map, &path, static_arrays, child_inside_evaluation);
        }
    }
}