diff --git a/node-graph/interpreted-executor/src/util.rs b/node-graph/interpreted-executor/src/util.rs index 670f00d397..44693d8b96 100644 --- a/node-graph/interpreted-executor/src/util.rs +++ b/node-graph/interpreted-executor/src/util.rs @@ -1,13 +1,44 @@ +use core_types::ProtoNodeIdentifier; use graph_craft::application_io::PlatformEditorApi; use graph_craft::concrete; use graph_craft::document::value::TaggedValue; use graph_craft::document::{DocumentNode, DocumentNodeImplementation, NodeInput, NodeNetwork}; use graph_craft::generic; use graphene_std::Context; -use graphene_std::ContextFeatures; +use graphene_std::ContextDependencies; +use graphene_std::registry::{NODE_METADATA, RegistryValueSource}; use graphene_std::uuid::NodeId; use std::sync::Arc; +fn proto_node_template(identifier: ProtoNodeIdentifier, regular_inputs: Vec) -> DocumentNode { + let metadata_lock = NODE_METADATA.lock().unwrap(); + let metadata = metadata_lock + .get(&identifier) + .unwrap_or_else(|| panic!("Node `{}` not registered in NODE_METADATA", identifier.as_str())); + + let mut regular_iter = regular_inputs.into_iter(); + let inputs: Vec = metadata + .fields + .iter() + .map(|field| match &field.value_source { + RegistryValueSource::Scope(name) => NodeInput::scope(*name), + _ => regular_iter + .next() + .unwrap_or_else(|| panic!("Not enough non-scope inputs for `{}`", identifier.as_str())), + }) + .collect(); + assert!(regular_iter.next().is_none(), "Too many non-scope inputs for `{}`", identifier.as_str()); + + let context_features = ContextDependencies::from(metadata.context_features.as_slice()); + + DocumentNode { + inputs, + implementation: DocumentNodeImplementation::ProtoNode(identifier), + context_features, + ..Default::default() + } +} + pub fn wrap_network_in_scope(network: NodeNetwork, editor_api: Arc) -> NodeNetwork { let inner_network = DocumentNode { implementation: DocumentNodeImplementation::Network(network), @@ -15,84 +46,22 @@ pub fn wrap_network_in_scope(network: NodeNetwork, editor_api: Arc