use serde_json::Value;
pub struct ConnectorRef<'a> {
pub function: &'a str,
pub connector: &'a str,
pub input: &'a Value,
}
pub fn connector_refs(tasks: &Value) -> Vec<ConnectorRef<'_>> {
let Some(tasks) = tasks.as_array() else {
return Vec::new();
};
tasks
.iter()
.filter_map(|task| {
let function = task.get("function")?;
let name = function.get("name")?.as_str()?;
if !crate::engine::CONNECTOR_FUNCTIONS.contains(&name) {
return None;
}
let input = function.get("input")?;
Some(ConnectorRef {
function: name,
connector: input.get("connector")?.as_str()?,
input,
})
})
.collect()
}
pub fn channel_call_targets(tasks: &Value) -> (Vec<&str>, bool) {
let Some(tasks) = tasks.as_array() else {
return (Vec::new(), false);
};
let mut targets = Vec::new();
let mut dynamic = false;
for task in tasks {
let Some(input) = task
.get("function")
.filter(|f| f.get("name").and_then(|n| n.as_str()) == Some("channel_call"))
.and_then(|f| f.get("input"))
else {
continue;
};
if let Some(target) = input.get("channel").and_then(|c| c.as_str())
&& !target.is_empty()
&& !targets.contains(&target)
{
targets.push(target);
}
if input.get("channel_logic").is_some_and(|l| !l.is_null()) {
dynamic = true;
}
}
(targets, dynamic)
}