use crate::{Result, RuleSet, validation};
use std::path::Path;
#[derive(Debug)]
pub struct ValidateCommand;
impl ValidateCommand {
pub fn run(rules_path: &Path) -> Result<()> {
let spinner = super::create_spinner("Loading and validating rules...");
let rule_set = RuleSet::load(rules_path)?;
let rules = rule_set.as_unified();
let result = validation::validate(&rules)?;
spinner.finish_and_clear();
if result.is_valid() {
super::print_success("All rules are valid!");
} else {
super::print_error(&format!(
"Validation failed: {} errors, {} warnings",
result.error_count(),
result.warning_count()
));
}
if !result.lint_issues.is_empty() {
println!();
println!("đ Lint Issues:");
for issue in &result.lint_issues {
let prefix = match issue.severity {
validation::LintSeverity::Error => " â",
validation::LintSeverity::Warning => " â ī¸",
validation::LintSeverity::Info => " âšī¸",
};
println!("{} {}", prefix, issue.message);
if let Some(suggestion) = &issue.suggestion {
println!(" đĄ {}", suggestion);
}
}
}
if !result.conflicts.is_empty() {
println!();
println!("âī¸ Conflicts:");
for conflict in &result.conflicts {
println!(" â {}", conflict.description);
for rule in &conflict.rules {
println!(" - {}", rule);
}
if let Some(suggestion) = &conflict.suggestion {
println!(" đĄ {}", suggestion);
}
}
}
if !result.coverage_gaps.is_empty() {
println!();
println!("đ Coverage Gaps:");
for gap in &result.coverage_gaps {
println!(" â ī¸ {}", gap);
}
}
if result.is_valid() {
Ok(())
} else {
Err(crate::DrivenError::Validation(format!(
"{} errors found",
result.error_count()
)))
}
}
pub fn run_strict(rules_path: &Path) -> Result<()> {
let result = Self::run(rules_path);
if result.is_ok() {
let rule_set = RuleSet::load(rules_path)?;
let rules = rule_set.as_unified();
let validation_result = validation::validate(&rules)?;
if validation_result.warning_count() > 0 {
return Err(crate::DrivenError::Validation(format!(
"{} warnings in strict mode",
validation_result.warning_count()
)));
}
}
result
}
}