pub mod error;
pub mod provider;
pub mod registry;
pub mod suggestion;
pub mod validation;
pub use error::{ValidationError, ValidationResult};
pub use provider::{OptionDef, OptionProvider, OptionValueType, ValueValidator};
pub use registry::ValidationRegistry;
pub use validation::{ValidationConfig, ValidationLevel};
use std::collections::HashMap;
pub struct ValidationEngine {
registry: ValidationRegistry,
config: ValidationConfig,
}
impl Default for ValidationEngine {
fn default() -> Self {
Self::new()
}
}
impl ValidationEngine {
pub fn new() -> Self {
let mut registry = ValidationRegistry::new();
registry.register_provider(Box::new(provider::cargo::CargoProvider::new()));
Self {
registry,
config: ValidationConfig::default(),
}
}
pub fn with_config(config: ValidationConfig) -> Self {
let mut engine = Self::new();
engine.config = config;
engine
}
pub fn validate_option(
&self,
command: &str,
option: &str,
value: Option<&str>,
) -> ValidationResult<()> {
if self.config.level == ValidationLevel::Off {
return Ok(());
}
self.registry
.validate_option(command, option, value, &self.config)
}
pub fn validate_options(
&self,
command: &str,
options: &HashMap<String, Option<String>>,
) -> ValidationResult<()> {
for (option, value) in options {
self.validate_option(command, option, value.as_deref())?;
}
Ok(())
}
pub fn suggest_option(&self, command: &str, option: &str) -> Vec<String> {
self.registry.suggest_option(command, option)
}
pub fn get_options(&self, command: &str) -> Vec<OptionDef> {
self.registry.get_options(command)
}
pub fn register_provider(&mut self, provider: Box<dyn OptionProvider>) {
self.registry.register_provider(provider);
}
}