mod calculation;
mod dimension;
mod schema;
mod value;
use crate::{InstanceDocument, TaxonomySet};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Severity {
Error,
Warning,
}
#[derive(Debug, Clone)]
pub struct ValidationMessage {
pub severity: Severity,
pub code: String,
pub message: String,
pub concept_name: Option<String>,
pub context_ref: Option<String>,
}
#[derive(Debug, Default)]
pub struct ValidationResult {
pub messages: Vec<ValidationMessage>,
}
impl ValidationResult {
pub fn new() -> Self {
Self::default()
}
pub fn errors(&self) -> Vec<&ValidationMessage> {
self.messages
.iter()
.filter(|m| m.severity == Severity::Error)
.collect()
}
pub fn warnings(&self) -> Vec<&ValidationMessage> {
self.messages
.iter()
.filter(|m| m.severity == Severity::Warning)
.collect()
}
pub fn is_valid(&self) -> bool {
!self.messages.iter().any(|m| m.severity == Severity::Error)
}
fn add(
&mut self,
severity: Severity,
code: &str,
message: String,
concept_name: Option<String>,
context_ref: Option<String>,
) {
self.messages.push(ValidationMessage {
severity,
code: code.to_string(),
message,
concept_name,
context_ref,
});
}
}
pub fn validate_all(instance: &InstanceDocument, taxonomy: &TaxonomySet) -> ValidationResult {
let mut result = ValidationResult::new();
let prepared = value::prepare_fact_values(instance, taxonomy, &mut result);
schema::validate_schema(instance, taxonomy, &prepared, &mut result);
calculation::validate_calculations(instance, taxonomy, &prepared, &mut result);
dimension::validate_dimensions(instance, taxonomy, &mut result);
result
}