tramli_plugins/subflow/
mod.rs1use std::any::TypeId;
2use std::collections::HashSet;
3use tramli::{FlowDefinition, FlowState};
4
5pub 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}