Skip to main content

tramli_plugins/subflow/
mod.rs

1use std::any::TypeId;
2use std::collections::HashSet;
3use tramli::{FlowDefinition, FlowState};
4
5/// Validates subflow entry requirements against parent's available data.
6pub struct GuaranteedSubflowValidator;
7
8impl GuaranteedSubflowValidator {
9    pub fn validate<S: FlowState, T: FlowState>(
10        parent: &FlowDefinition<S>,
11        parent_state: S,
12        subflow: &FlowDefinition<T>,
13        guaranteed_types: &HashSet<TypeId>,
14    ) -> Result<(), String> {
15        let mut available: HashSet<TypeId> = parent.data_flow_graph().available_at(parent_state);
16        available.extend(guaranteed_types);
17
18        if let Some(initial) = subflow.initial_state() {
19            let required_at_entry = subflow.data_flow_graph().available_at(initial);
20            let missing: HashSet<TypeId> = required_at_entry.difference(&available).cloned().collect();
21            if !missing.is_empty() {
22                let missing_names: Vec<String> = missing.iter()
23                    .map(|id| subflow.data_flow_graph().type_name(id).to_string())
24                    .collect();
25                return Err(format!(
26                    "Subflow {} is missing guaranteed types at entry: [{}]",
27                    subflow.name,
28                    missing_names.join(", "),
29                ));
30            }
31        }
32        Ok(())
33    }
34}