pidgin_lang/validator/
schema.rs1use 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 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 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 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}