Skip to main content

overlay_file/
validator.rs

1use log::debug;
2
3use crate::{ElementType, KeyType, OverlayDef, OverlayElementDef, OverlayFile};
4use std::collections::HashSet;
5
6pub struct OverlayfileValidator;
7
8// TODO create validation rules for overlay definition file
9// TODO create validation rules for ocafile against overlay definition file
10
11#[derive(Debug, serde::Serialize)]
12pub enum ValidationError {
13    MissingRequiredElement(String),
14    InvalidKeyType(String),
15    InvalidValueType(String),
16    DuplicateElement(String),
17    UnknownUniqueKey(String),
18}
19
20impl OverlayfileValidator {
21    pub fn validate(overlay_file: &OverlayFile) -> Result<(), Vec<ValidationError>> {
22        let mut errors = Vec::new();
23
24        for overlay_def in &overlay_file.overlays_def {
25            errors.extend(Self::validate_overlay_def(overlay_def));
26        }
27
28        if errors.is_empty() {
29            Ok(())
30        } else {
31            Err(errors)
32        }
33    }
34
35    fn validate_overlay_def(overlay_def: &OverlayDef) -> Vec<ValidationError> {
36        let mut errors = Vec::new();
37        let mut element_names = HashSet::new();
38
39        for element in &overlay_def.elements {
40            if !element_names.insert(&element.name) {
41                debug!("duplicated {:?}", element);
42                errors.push(ValidationError::DuplicateElement(element.name.clone()));
43            }
44
45            errors.extend(Self::validate_element(element));
46        }
47
48        for key in &overlay_def.unique_keys {
49            if !element_names.contains(key) {
50                errors.push(ValidationError::UnknownUniqueKey(key.clone()));
51            }
52        }
53
54        errors
55    }
56
57    fn validate_element(element: &OverlayElementDef) -> Vec<ValidationError> {
58        let errors = Vec::new();
59
60        // Validate key type
61        match element.keys {
62            KeyType::AttrNames | KeyType::Text => {}
63            KeyType::None => {}
64        }
65
66        // Validate value type
67        match &element.values {
68            ElementType::Object(_) | ElementType::Text | ElementType::Binary | ElementType::Ref => {
69            }
70            ElementType::Array(_constraints) => {
71                // Add additional validation for array constraints if needed
72            }
73            ElementType::Lang => {
74                //TODO Additional validation for language element
75            }
76            ElementType::Complex(_element_types) => {
77                debug!("Validation of complex element for overlay");
78            }
79            ElementType::Any => {
80                // Skip validation allow anything
81            }
82        }
83
84        errors
85    }
86}