overlay_file/
validator.rs1use log::debug;
2
3use crate::{ElementType, KeyType, OverlayDef, OverlayElementDef, OverlayFile};
4use std::collections::HashSet;
5
6pub struct OverlayfileValidator;
7
8#[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 match element.keys {
62 KeyType::AttrNames | KeyType::Text => {}
63 KeyType::None => {}
64 }
65
66 match &element.values {
68 ElementType::Object(_) | ElementType::Text | ElementType::Binary | ElementType::Ref => {
69 }
70 ElementType::Array(_constraints) => {
71 }
73 ElementType::Lang => {
74 }
76 ElementType::Complex(_element_types) => {
77 debug!("Validation of complex element for overlay");
78 }
79 ElementType::Any => {
80 }
82 }
83
84 errors
85 }
86}