pub mod helpers;
mod shacl_validator;
pub use shacl_validator::ShaclValidator;
use crate::error::Result;
use crate::metamodel::Aspect;
#[derive(Debug, Clone)]
pub struct ValidationResult {
pub is_valid: bool,
pub errors: Vec<ValidationError>,
pub warnings: Vec<ValidationWarning>,
}
#[derive(Debug, Clone)]
pub struct ValidationError {
pub message: String,
pub element_urn: Option<String>,
pub property_path: Option<String>,
}
#[derive(Debug, Clone)]
pub struct ValidationWarning {
pub message: String,
pub element_urn: Option<String>,
}
impl ValidationResult {
pub fn new(is_valid: bool) -> Self {
Self {
is_valid,
errors: Vec::new(),
warnings: Vec::new(),
}
}
pub fn add_error(&mut self, error: ValidationError) {
self.errors.push(error);
self.is_valid = false;
}
pub fn add_warning(&mut self, warning: ValidationWarning) {
self.warnings.push(warning);
}
}
pub async fn validate_aspect(aspect: &Aspect) -> Result<ValidationResult> {
let validator = ShaclValidator::new();
validator.validate(aspect).await
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_validation_result() {
let mut result = ValidationResult::new(true);
assert!(result.is_valid);
assert_eq!(result.errors.len(), 0);
result.add_error(ValidationError {
message: "Test error".to_string(),
element_urn: None,
property_path: None,
});
assert!(!result.is_valid);
assert_eq!(result.errors.len(), 1);
}
}