pub mod violation;
mod rules;
use crate::{
model::document::{Document, SpecVersion},
validate::{
rules::{
document::{check_component_names, check_servers, check_tags},
extensions::check_extensions,
opaque::check_opaque,
},
violation::{Severity, SpecError, Violation},
},
};
#[derive(Clone, Copy, Debug)]
pub struct Validator {
version: SpecVersion,
}
impl Validator {
#[must_use]
pub fn new(version: SpecVersion) -> Self {
Self { version }
}
#[must_use]
pub fn validate(&self, document: &Document) -> Vec<Violation> {
let mut violations = Vec::new();
if !self.version.supports_3_2() {
let blockers = crate::emit::downgrade::three_two_only_constructs(document);
if !blockers.is_empty() {
violations.push(Violation::error("#", SpecError::RequiresV3_2 { blockers }));
}
}
check_servers(document, &mut violations);
check_tags(document, &mut violations);
check_component_names(document, &mut violations);
self.check_paths(document, &mut violations);
check_opaque(document, &mut violations);
check_extensions("#", &document.extensions, &mut violations);
violations
}
}
impl Document {
pub fn validate(&self, version: SpecVersion) -> Result<(), Vec<Violation>> {
let errors: Vec<Violation> = Validator::new(version)
.validate(self)
.into_iter()
.filter(|violation| violation.severity == Severity::Error)
.collect();
if errors.is_empty() {
Ok(())
} else {
Err(errors)
}
}
}
#[cfg(test)]
mod tests;