@@ -244,38 +244,38 @@ impl<'a> ModifyInputsContext<'a> {
244244 // Start from the layer node or export
245245 let output_layer = self . get_output_layer ( ) ?;
246246
247- let upstream = self
248- . network_interface
249- . upstream_flow_back_from_nodes ( vec ! [ output_layer. to_node( ) ] , & [ ] , network_interface:: FlowType :: HorizontalFlow ) ;
247+ let existing_node_id = Self :: locate_existing_id ( output_layer, self . network_interface , reference) ;
250248
251- // Take until another layer node is found (but not the first layer node)
252- let mut existing_node_id = None ;
253- for upstream_node in upstream. collect :: < Vec < _ > > ( ) {
249+ // Create a new node if the node does not exist and update its inputs
250+ if create_if_nonexistent {
251+ return existing_node_id. or_else ( || self . create_node ( reference) ) ;
252+ }
253+
254+ existing_node_id
255+ }
256+
257+ /// Gets the node id of a node with a specific reference that is upstream from the layer node.
258+ pub fn locate_existing_id ( output_layer : LayerNodeIdentifier , network_interface : & NodeNetworkInterface , reference : & str ) -> Option < NodeId > {
259+ let upstream = network_interface. upstream_flow_back_from_nodes ( vec ! [ output_layer. to_node( ) ] , & [ ] , network_interface:: FlowType :: HorizontalFlow ) ;
260+
261+ // Look at all of the upstream nodes
262+ for upstream_node in upstream {
254263 // Check if this is the node we have been searching for.
255- if self
256- . network_interface
264+ if network_interface
257265 . reference ( & upstream_node, & [ ] )
258266 . is_some_and ( |node_reference| * node_reference == Some ( reference. to_string ( ) ) )
259267 {
260- existing_node_id = Some ( upstream_node) ;
261- break ;
268+ return Some ( upstream_node) ;
262269 }
263270
264- let is_traversal_start = |node_id : NodeId | {
265- self . layer_node . map ( |layer| layer. to_node ( ) ) == Some ( node_id) || self . network_interface . document_network ( ) . exports . iter ( ) . any ( |export| export. as_node ( ) == Some ( node_id) )
266- } ;
271+ let is_traversal_start = |node_id : NodeId | output_layer. to_node ( ) == node_id || network_interface. document_network ( ) . exports . iter ( ) . any ( |export| export. as_node ( ) == Some ( node_id) ) ;
267272
268- if !is_traversal_start ( upstream_node) && ( self . network_interface . is_layer ( & upstream_node, & [ ] ) ) {
269- break ;
273+ // Take until another layer node is found (but not the first layer node)
274+ if !is_traversal_start ( upstream_node) && ( network_interface. is_layer ( & upstream_node, & [ ] ) ) {
275+ return None ;
270276 }
271277 }
272-
273- // Create a new node if the node does not exist and update its inputs
274- if create_if_nonexistent {
275- return existing_node_id. or_else ( || self . create_node ( reference) ) ;
276- }
277-
278- existing_node_id
278+ None
279279 }
280280
281281 /// Create a new node inside the layer
0 commit comments