use super::super::schema::NodeSpec;
use indexmap::IndexMap;
pub struct FlatSpec {
pub node_type: String,
pub spec: NodeSpec,
pub parent: Option<String>,
pub is_manual: bool,
pub input: Option<String>,
}
pub(super) fn collect_specs(nodes: &IndexMap<String, NodeSpec>) -> (Vec<FlatSpec>, Vec<FlatSpec>) {
let mut core = Vec::new();
let mut subs = Vec::new();
for (name, spec) in nodes {
let input = spec.input_name().map(str::to_string);
let is_manual = input.is_none();
core.push(FlatSpec {
node_type: name.clone(),
spec: clone_without_subs(spec),
parent: None,
is_manual,
input,
});
for (sub_name, sub_spec) in &spec.sub_nodes {
let sub_clone = clone_without_subs(sub_spec);
subs.push(FlatSpec {
node_type: sub_name.clone(),
spec: sub_clone,
parent: Some(name.clone()),
is_manual: false,
input: sub_spec.input_name().map(str::to_string),
});
}
}
(core, subs)
}
fn clone_without_subs(spec: &NodeSpec) -> NodeSpec {
NodeSpec {
sub_nodes: IndexMap::new(),
..spec.clone()
}
}
#[cfg(test)]
#[path = "../build_spec_clone_tests.rs"]
mod spec_clone_tests;