Compare commits

..

2 Commits

Author SHA1 Message Date
Priec
96cde3ca0d working examples 4 and 5 2025-08-07 00:23:45 +02:00
Priec
6ba0124779 feature5 implementation is full now 2025-08-07 00:03:11 +02:00
6 changed files with 1667 additions and 561 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -134,6 +134,24 @@ impl<D: DataProvider> FormEditor<D> {
&self.ui_state &self.ui_state
} }
/// Set external validation state for a field (Feature 5)
#[cfg(feature = "validation")]
pub fn set_external_validation(
&mut self,
field_index: usize,
state: crate::validation::ExternalValidationState,
) {
self.ui_state
.validation
.set_external_validation(field_index, state);
}
/// Clear external validation state for a field (Feature 5)
#[cfg(feature = "validation")]
pub fn clear_external_validation(&mut self, field_index: usize) {
self.ui_state.validation.clear_external_validation(field_index);
}
/// Get effective display text for any field index. /// Get effective display text for any field index.
/// ///
/// Policies: /// Policies:

View File

@@ -22,6 +22,9 @@ pub struct ValidationConfig {
#[cfg(feature = "validation")] #[cfg(feature = "validation")]
pub custom_formatter: Option<Arc<dyn CustomFormatter + Send + Sync>>, pub custom_formatter: Option<Arc<dyn CustomFormatter + Send + Sync>>,
/// Enable external validation indicator UI (feature 5)
pub external_validation_enabled: bool,
/// Future: External validation /// Future: External validation
pub external_validation: Option<()>, // Placeholder for future implementation pub external_validation: Option<()>, // Placeholder for future implementation
} }
@@ -47,6 +50,7 @@ impl std::fmt::Debug for ValidationConfig {
} }
}, },
) )
.field("external_validation_enabled", &self.external_validation_enabled)
.field("external_validation", &self.external_validation) .field("external_validation", &self.external_validation)
.finish() .finish()
} }
@@ -285,6 +289,12 @@ impl ValidationConfigBuilder {
self self
} }
/// Enable or disable external validation indicator UI (feature 5)
pub fn with_external_validation_enabled(mut self, enabled: bool) -> Self {
self.config.external_validation_enabled = enabled;
self
}
/// Build the final validation configuration /// Build the final validation configuration
pub fn build(self) -> ValidationConfig { pub fn build(self) -> ValidationConfig {
self.config self.config

View File

@@ -16,6 +16,16 @@ pub use patterns::{PatternFilters, PositionFilter, PositionRange, CharacterFilte
pub use mask::DisplayMask; // Simple mask instead of ReservedCharacters pub use mask::DisplayMask; // Simple mask instead of ReservedCharacters
pub use formatting::{CustomFormatter, FormattingResult, PositionMapper, DefaultPositionMapper}; pub use formatting::{CustomFormatter, FormattingResult, PositionMapper, DefaultPositionMapper};
/// External validation UI state (Feature 5)
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ExternalValidationState {
NotValidated,
Validating,
Valid(Option<String>),
Invalid { message: String, suggestion: Option<String> },
Warning { message: String },
}
/// Validation error types /// Validation error types
#[derive(Debug, Clone, thiserror::Error)] #[derive(Debug, Clone, thiserror::Error)]
pub enum ValidationError { pub enum ValidationError {

View File

@@ -1,9 +1,7 @@
// src/validation/state.rs // src/validation/state.rs
//! Validation state management //! Validation state management
use crate::validation::{ValidationConfig, ValidationResult}; use crate::validation::{ValidationConfig, ValidationResult, ExternalValidationState};
#[cfg(feature = "validation")]
use crate::validation::{PositionMapper};
use std::collections::HashMap; use std::collections::HashMap;
/// Validation state for all fields in a form /// Validation state for all fields in a form
@@ -20,6 +18,9 @@ pub struct ValidationState {
/// Global validation enabled/disabled /// Global validation enabled/disabled
enabled: bool, enabled: bool,
/// External validation results per field (Feature 5)
external_results: HashMap<usize, ExternalValidationState>,
} }
impl ValidationState { impl ValidationState {
@@ -30,6 +31,7 @@ impl ValidationState {
field_results: HashMap::new(), field_results: HashMap::new(),
validated_fields: std::collections::HashSet::new(), validated_fields: std::collections::HashSet::new(),
enabled: true, enabled: true,
external_results: HashMap::new(),
} }
} }
@@ -40,6 +42,7 @@ impl ValidationState {
// Clear all validation results when disabled // Clear all validation results when disabled
self.field_results.clear(); self.field_results.clear();
self.validated_fields.clear(); self.validated_fields.clear();
self.external_results.clear(); // Also clear external results
} }
} }
@@ -50,12 +53,13 @@ impl ValidationState {
/// Set validation configuration for a field /// Set validation configuration for a field
pub fn set_field_config(&mut self, field_index: usize, config: ValidationConfig) { pub fn set_field_config(&mut self, field_index: usize, config: ValidationConfig) {
if config.has_validation() { if config.has_validation() || config.external_validation_enabled {
self.field_configs.insert(field_index, config); self.field_configs.insert(field_index, config);
} else { } else {
self.field_configs.remove(&field_index); self.field_configs.remove(&field_index);
self.field_results.remove(&field_index); self.field_results.remove(&field_index);
self.validated_fields.remove(&field_index); self.validated_fields.remove(&field_index);
self.external_results.remove(&field_index);
} }
} }
@@ -69,6 +73,30 @@ impl ValidationState {
self.field_configs.remove(&field_index); self.field_configs.remove(&field_index);
self.field_results.remove(&field_index); self.field_results.remove(&field_index);
self.validated_fields.remove(&field_index); self.validated_fields.remove(&field_index);
self.external_results.remove(&field_index);
}
/// Set external validation state for a field (Feature 5)
pub fn set_external_validation(&mut self, field_index: usize, state: ExternalValidationState) {
self.external_results.insert(field_index, state);
}
/// Get current external validation state for a field
pub fn get_external_validation(&self, field_index: usize) -> ExternalValidationState {
self.external_results
.get(&field_index)
.cloned()
.unwrap_or(ExternalValidationState::NotValidated)
}
/// Clear external validation state for a field
pub fn clear_external_validation(&mut self, field_index: usize) {
self.external_results.remove(&field_index);
}
/// Clear all external validation states
pub fn clear_all_external_validation(&mut self) {
self.external_results.clear();
} }
/// Validate character insertion for a field /// Validate character insertion for a field
@@ -131,7 +159,7 @@ impl ValidationState {
&self, &self,
field_index: usize, field_index: usize,
raw: &str, raw: &str,
) -> Option<(String, std::sync::Arc<dyn PositionMapper>, Option<String>)> { ) -> Option<(String, std::sync::Arc<dyn crate::validation::PositionMapper>, Option<String>)> {
let config = self.field_configs.get(&field_index)?; let config = self.field_configs.get(&field_index)?;
config.run_custom_formatter(raw) config.run_custom_formatter(raw)
} }