use std::process::ExitCode;
use schematron::validate::{PhaseSelection, ValidateOptions};
use schematron::{Document, Schema};
fn main() -> ExitCode {
let args: Vec<String> = std::env::args().skip(1).collect();
let (schema_path, document_path) = match args.len() {
0 => ("examples/invoice.sch", "examples/invoice-bad.xml"),
2 => (args[0].as_str(), args[1].as_str()),
_ => {
eprintln!("usage: validate_file [SCHEMA.sch DOCUMENT.xml]");
return ExitCode::from(2);
}
};
let schema = match Schema::from_path(schema_path) {
Ok(schema) => schema,
Err(error) => {
eprintln!("schema error: {error}");
return ExitCode::from(3);
}
};
let document = match Document::from_path(document_path) {
Ok(document) => document,
Err(error) => {
eprintln!("document error: {error}");
return ExitCode::from(4);
}
};
let options = ValidateOptions::new().with_phase(PhaseSelection::All);
let report = match schema.validate_with(&document, &options) {
Ok(report) => report,
Err(error) => {
eprintln!("validation error: {error}");
return ExitCode::from(3);
}
};
println!("{document_path}");
println!(" rules fired: {}", report.count_fired_rules());
for failure in report.failures() {
println!(" FAIL {}", failure.location);
println!(" {}", failure.text.trim());
for diagnostic in &failure.diagnostics {
println!(" ({})", diagnostic.text.trim());
}
}
for observation in report.reports() {
println!(" NOTE {}", observation.location);
println!(" {}", observation.text.trim());
}
if report.is_valid() {
println!(" valid");
ExitCode::SUCCESS
} else {
println!(" {} failed assertion(s)", report.count_failures());
ExitCode::from(1)
}
}