use super::{ValidationIssue, ValidationReport};
#[derive(Debug, Default)]
pub struct ReportBuilder {
strict: bool,
issues: Vec<ValidationIssue>,
}
impl ReportBuilder {
pub fn new(strict: bool) -> Self {
Self {
strict,
issues: Vec::new(),
}
}
pub fn push(&mut self, issue: ValidationIssue) {
self.issues.push(issue);
}
pub fn extend<I>(&mut self, issues: I)
where
I: IntoIterator<Item = ValidationIssue>,
{
self.issues.extend(issues);
}
pub fn finish(self) -> ValidationReport {
ValidationReport::new(self.issues, self.strict)
}
}
pub fn report(strict: bool) -> ReportBuilder {
ReportBuilder::new(strict)
}
#[cfg(test)]
mod tests {
use super::*;
fn issue(level: &str, path: &str, message: &str) -> ValidationIssue {
ValidationIssue {
level: level.to_string(),
path: path.to_string(),
message: message.to_string(),
line: None,
column: None,
rule_id: None,
metadata: None,
}
}
#[test]
fn finish_non_strict_only_fails_on_errors() {
let mut builder = ReportBuilder::new(false);
builder.push(issue("WARNING", "spec.md", "brief purpose"));
let report = builder.finish();
assert!(report.valid);
assert_eq!(report.summary.errors, 0);
assert_eq!(report.summary.warnings, 1);
}
#[test]
fn finish_strict_fails_on_warnings() {
let mut builder = report(true);
builder.push(issue("WARNING", "spec.md", "brief purpose"));
let result = builder.finish();
assert!(!result.valid);
assert_eq!(result.summary.errors, 0);
assert_eq!(result.summary.warnings, 1);
}
#[test]
fn extend_collects_multiple_issues() {
let mut builder = report(false);
builder.extend(vec![
issue("ERROR", "a.md", "a"),
issue("INFO", "b.md", "b"),
issue("WARNING", "c.md", "c"),
]);
let result = builder.finish();
assert!(!result.valid);
assert_eq!(result.issues.len(), 3);
assert_eq!(result.summary.errors, 1);
assert_eq!(result.summary.warnings, 1);
assert_eq!(result.summary.info, 1);
}
}