use alloc::collections::BTreeSet;
use alloc::string::String;
pub struct ValidationContext {
in_progress: BTreeSet<(usize, String)>,
cache: BTreeSet<(usize, String)>,
evaluated_properties: BTreeSet<(u32, String)>,
evaluated_items: BTreeSet<(u32, usize)>,
schema_depth: u32,
}
impl ValidationContext {
#[must_use]
pub fn new() -> Self {
Self {
in_progress: BTreeSet::new(),
cache: BTreeSet::new(),
evaluated_properties: BTreeSet::new(),
evaluated_items: BTreeSet::new(),
schema_depth: 0,
}
}
#[allow(dead_code)]
pub fn enter(&mut self, node_id: usize, instance_path: &str) -> bool {
let key = (node_id, instance_path.to_string());
if self.in_progress.contains(&key) {
return false;
}
if self.cache.contains(&key) {
return false;
}
self.in_progress.insert(key);
true
}
#[allow(dead_code)]
pub fn exit(&mut self, node_id: usize, instance_path: &str, valid: bool) {
let key = (node_id, instance_path.to_string());
self.in_progress.remove(&key);
if valid {
self.cache.insert(key);
}
}
pub fn enter_schema(&mut self) {
self.schema_depth += 1;
}
pub fn exit_schema(&mut self) {
if self.schema_depth > 0 {
self.schema_depth -= 1;
}
}
#[must_use]
pub fn current_schema_depth(&self) -> u32 {
self.schema_depth
}
pub fn mark_property_evaluated(&mut self, name: &str) {
self.evaluated_properties
.insert((self.schema_depth, name.to_string()));
}
#[must_use]
pub fn is_property_evaluated(&self, name: &str) -> bool {
self.evaluated_properties
.contains(&(self.schema_depth, name.to_string()))
}
pub fn mark_item_evaluated(&mut self, index: usize) {
self.evaluated_items.insert((self.schema_depth, index));
}
#[must_use]
pub fn is_item_evaluated(&self, index: usize) -> bool {
self.evaluated_items.contains(&(self.schema_depth, index))
}
#[must_use]
pub fn save_evaluation_state(&self) -> EvaluationState {
EvaluationState {
evaluated_properties: self.evaluated_properties.clone(),
evaluated_items: self.evaluated_items.clone(),
schema_depth: self.schema_depth,
}
}
pub fn merge_evaluation_state(&mut self, state: &EvaluationState) {
for (depth, name) in &state.evaluated_properties {
if *depth == self.schema_depth {
self.evaluated_properties.insert((*depth, name.clone()));
}
}
for (depth, idx) in &state.evaluated_items {
if *depth == self.schema_depth {
self.evaluated_items.insert((*depth, *idx));
}
}
}
pub fn restore_evaluation_state(&mut self, state: &EvaluationState) {
self.evaluated_properties
.clone_from(&state.evaluated_properties);
self.evaluated_items.clone_from(&state.evaluated_items);
self.schema_depth = state.schema_depth;
}
}
impl Default for ValidationContext {
fn default() -> Self {
Self::new()
}
}
#[derive(Clone)]
pub struct EvaluationState {
evaluated_properties: BTreeSet<(u32, String)>,
evaluated_items: BTreeSet<(u32, usize)>,
schema_depth: u32,
}
impl EvaluationState {
pub fn evaluated_properties(&self) -> impl Iterator<Item = &(u32, String)> {
self.evaluated_properties.iter()
}
pub fn evaluated_items(&self) -> impl Iterator<Item = &(u32, usize)> {
self.evaluated_items.iter()
}
}