| Crates.io | raz-validation |
| lib.rs | raz-validation |
| version | 0.2.4 |
| created_at | 2025-07-04 09:02:55.140392+00 |
| updated_at | 2025-07-07 09:26:45.978451+00 |
| description | Smart options validation system for raz |
| homepage | https://github.com/raz-rs/raz |
| repository | https://github.com/raz-rs/raz |
| max_upload_size | |
| id | 1737656 |
| size | 83,674 |
Smart options validation system for the Raz command generator.
use raz_validation::{ValidationEngine, ValidationConfig, ValidationLevel};
// Create validation engine
let engine = ValidationEngine::new();
// Validate cargo options
assert!(engine.validate_option("build", "--release", None).is_ok());
assert!(engine.validate_option("build", "--features", Some("serde,tokio")).is_ok());
// Validate leptos options
assert!(engine.validate_option("leptos build", "--bin-features", Some("ssr")).is_ok());
// Get suggestions for typos
let suggestions = engine.suggest_option("build", "--relase");
assert!(suggestions.contains(&"--release".to_string()));
let config = ValidationConfig::with_level(ValidationLevel::Strict);
let engine = ValidationEngine::with_config(config);
// This will fail in strict mode
let result = engine.validate_option("build", "--unknown-option", None);
assert!(result.is_err());
build, test, run, check, clippy--release, --features, --target, --jobs--lib vs --bin vs --binsleptos build, leptos serve, leptos watch--bin-features, --lib-features, --hot-reloadleptos new --template start-axumThe validation system integrates seamlessly with the raz-override parser:
use raz_override::parser::override_parser::OverrideParser;
use raz_validation::{ValidationConfig, ValidationLevel};
// Create parser with validation
let config = ValidationConfig::with_level(ValidationLevel::Strict);
let parser = OverrideParser::with_validation_config("build", config);
// Parse and validate
let parsed = parser.parse("--release --features serde").unwrap();
parser.validate(&parsed).unwrap(); // Will validate using the engine
// Get suggestions for typos
let suggestions = parser.suggest_option("--relase");
use raz_validation::provider::{OptionProvider, OptionDef, ValueValidator};
struct MyFrameworkProvider;
impl OptionProvider for MyFrameworkProvider {
fn name(&self) -> &str { "my-framework" }
fn get_options(&self, command: &str) -> Vec<OptionDef> {
vec![
OptionDef::flag("--my-flag", "Custom flag option"),
OptionDef::single("--my-value", "Custom value option", ValueValidator::Any),
]
}
fn validate(&self, command: &str, option: &str, value: Option<&str>) -> ValidationResult<()> {
// Custom validation logic
Ok(())
}
fn get_commands(&self) -> Vec<String> {
vec!["my-framework build".to_string()]
}
}
// Register the provider
let mut engine = ValidationEngine::new();
engine.register_provider(Box::new(MyFrameworkProvider));
The validation system provides detailed error messages:
match engine.validate_option("build", "--relase", None) {
Err(ValidationError::UnknownOption { command, option, suggestions }) => {
println!("Unknown option '{}' for command '{}'", option, command);
if !suggestions.is_empty() {
println!("Did you mean: {}", suggestions.join(", "));
}
}
Err(ValidationError::InvalidValue { option, value, reason }) => {
println!("Invalid value '{}' for option '{}': {}", value, option, reason);
}
_ => {}
}
See examples/basic_validation.rs for a comprehensive demo:
cargo run -p raz-validation --example basic_validation