use super::{LazyValidator, ValidationResult};
use crate::core::{errors::EditorError, EditorDocument, Result};
#[cfg(feature = "std")]
use std::time::Instant;
impl LazyValidator {
pub fn validate(&mut self, document: &EditorDocument) -> Result<&ValidationResult> {
let content = document.text();
let content_hash = self.calculate_hash(&content);
if self.should_use_cache(content_hash) {
return self.cached_result.as_ref().ok_or_else(|| {
EditorError::command_failed(
"Cache validation inconsistency: cached result expected but not found",
)
});
}
#[cfg(feature = "std")]
let start_time = Instant::now();
let issues = self.validate_with_core(&content, document)?;
#[cfg(feature = "std")]
let mut result = ValidationResult::new(issues);
#[cfg(not(feature = "std"))]
let result = ValidationResult::new(issues);
#[cfg(feature = "std")]
{
result.validation_time_us = start_time.elapsed().as_micros() as u64;
}
self.cached_result = Some(result);
self.content_hash = content_hash;
#[cfg(feature = "std")]
{
self.last_validation = Some(Instant::now());
}
self.cached_result.as_ref().ok_or_else(|| {
EditorError::command_failed("Validation completed but cached result is missing")
})
}
pub fn force_validate(&mut self, document: &EditorDocument) -> Result<&ValidationResult> {
self.cached_result = None; self.validate(document)
}
pub fn is_valid(&mut self, document: &EditorDocument) -> Result<bool> {
Ok(self.validate(document)?.is_valid)
}
pub fn cached_result(&self) -> Option<&ValidationResult> {
self.cached_result.as_ref()
}
pub fn clear_cache(&mut self) {
self.cached_result = None;
self.content_hash = 0;
#[cfg(feature = "std")]
{
self.last_validation = None;
}
}
fn should_use_cache(&self, content_hash: u64) -> bool {
if self.cached_result.is_none() || self.content_hash != content_hash {
return false;
}
#[cfg(feature = "std")]
{
if let Some(last_validation) = self.last_validation {
return last_validation.elapsed() < self.config.min_validation_interval;
}
}
true
}
fn calculate_hash(&self, content: &str) -> u64 {
let mut hash = 0xcbf29ce484222325u64;
for byte in content.bytes() {
hash ^= byte as u64;
hash = hash.wrapping_mul(0x100000001b3);
}
hash
}
}