Skip to main content

json_eval_rs/jsoneval/
mod.rs

1//! Schema evaluation engine.
2//!
3//! This module contains the Rust implementation behind [`JSONEval`]: parsing,
4//! dependency tracking, evaluation, layout resolution, validation, subforms, and
5//! schema caches. Crate root re-exports stable public types so callers usually do
6//! not need to import from submodules directly.
7
8use std::collections::HashMap;
9use std::sync::{Arc, Mutex};
10
11use crate::jsoneval::eval_data::EvalData;
12
13use crate::jsoneval::table_metadata::TableMetadata;
14
15use crate::jsoneval::types::DependentItem;
16use crate::rlogic::{LogicId, RLogic};
17
18use indexmap::{IndexMap, IndexSet};
19
20use serde_json::Value;
21
22pub mod cancellation;
23pub mod core;
24pub mod dependents;
25pub mod eval_cache;
26pub mod eval_data;
27pub mod evaluate;
28pub mod getters;
29pub mod json_parser;
30pub mod layout;
31pub mod logic;
32pub mod parsed_schema;
33pub mod parsed_schema_cache;
34pub mod path_utils;
35pub mod static_arrays;
36pub mod subform_methods;
37pub mod table_evaluate;
38pub mod table_metadata;
39pub mod types;
40pub mod validation;
41
42pub struct JSONEval {
43    pub schema: Arc<Value>,
44    pub engine: Arc<RLogic>,
45    pub evaluations: Arc<IndexMap<String, LogicId>>,
46    pub tables: Arc<IndexMap<String, Value>>,
47    pub table_metadata: Arc<IndexMap<String, TableMetadata>>,
48    pub dependencies: Arc<IndexMap<String, IndexSet<String>>>,
49    pub sorted_evaluations: Arc<Vec<Vec<String>>>,
50    pub dependents_evaluations: Arc<IndexMap<String, Vec<DependentItem>>>,
51    pub rules_evaluations: Arc<Vec<String>>,
52    pub fields_with_rules: Arc<Vec<String>>,
53    pub others_evaluations: Arc<Vec<String>>,
54    pub value_evaluations: Arc<Vec<String>>,
55    pub layout_paths: Arc<Vec<String>>,
56    pub options_templates: Arc<Vec<(String, String, String)>>,
57    pub subforms: IndexMap<String, Box<JSONEval>>,
58
59    pub reffed_by: Arc<IndexMap<String, Vec<String>>>,
60
61    /// Reverse map: data path → list of source field schema paths whose dependent
62    /// value/clear formulas reference that path (excluding $value/$refValue context vars).
63    /// When field X changes, source fields in dep_formula_triggers[X] are re-queued so
64    /// their downstream dependents are re-evaluated with the new context.
65    pub dep_formula_triggers: Arc<IndexMap<String, Vec<(String, usize)>>>,
66
67    pub conditional_hidden_fields: Arc<Vec<String>>,
68    pub conditional_readonly_fields: Arc<Vec<String>>,
69    pub static_arrays: Arc<IndexMap<String, Arc<Value>>>,
70
71    pub context: Value,
72    pub data: Value,
73    pub evaluated_schema: Value,
74    pub eval_data: EvalData,
75    pub eval_cache: eval_cache::EvalCache,
76    pub(crate) eval_lock: Mutex<()>,
77    pub(crate) cached_msgpack_schema: Option<Vec<u8>>,
78    pub(crate) resolved_layout_cache: Option<Arc<Vec<crate::jsoneval::types::LayoutOverlayEntry>>>,
79    /// `$ref` targets hidden in every current resolved layout occurrence.
80    pub(crate) layout_hidden_refs: indexmap::IndexSet<String>,
81    /// `$ref` targets visible in at least one current resolved layout occurrence.
82    /// Used while resolving to subtract refs from layout_hidden_refs.
83    pub(crate) layout_visible_refs: indexmap::IndexSet<String>,
84    /// Subset of layout_hidden_refs hidden by a condition.hidden cascade and eligible for clearing.
85    pub(crate) layout_condition_hidden_refs: indexmap::IndexSet<String>,
86    pub(crate) regex_cache: std::sync::RwLock<HashMap<String, regex::Regex>>,
87}