Skip to main content

pidgin_lang/validator/
schema.rs

1use crate::ast::{FieldValue, PgnPacket};
2use crate::registry::WorkflowRegistry;
3use super::ValidationError;
4
5pub fn validate_schema(packet: &PgnPacket, workflows: &WorkflowRegistry) -> Vec<ValidationError> {
6    let mut errors = Vec::new();
7
8    // Check workflow exists
9    if let Some(FieldValue::Scalar(wf_name)) = packet.fields.get("wf") {
10        if !workflows.workflows.contains_key(wf_name) {
11            errors.push(ValidationError {
12                code: "PGN_E002".to_string(),
13                message: format!("unknown workflow: {}", wf_name),
14            });
15            return errors;
16        }
17
18        let workflow = &workflows.workflows[wf_name];
19
20        // Check mode is allowed
21        if let Some(FieldValue::Scalar(mode)) = packet.fields.get("mode")
22            && !workflow.allowed_modes.contains(mode)
23        {
24            errors.push(ValidationError {
25                code: "PGN_E003".to_string(),
26                message: format!(
27                    "invalid mode '{}' for workflow '{}'; allowed: {:?}",
28                    mode, wf_name, workflow.allowed_modes
29                ),
30            });
31        }
32
33        // Check risk level is valid
34        if let Some(FieldValue::Scalar(risk)) = packet.fields.get("risk")
35            && !["low", "med", "high", "crit"].contains(&risk.as_str())
36        {
37            errors.push(ValidationError {
38                code: "PGN_E004".to_string(),
39                message: format!("invalid risk level: {}", risk),
40            });
41        }
42    }
43
44    errors
45}