func (h *Renderer) Provision(g canvas.Graph, nodes []InterfaceNode) (err error) { newIds := []canvas.NodeIfc{} visitFn := func(prev, this canvas.Node) { provisionNode(g, this, &newIds) } t := canvas.NewDepthFirst(visitFn, filterInterfaceNode) defer func() { if r := recover(); r != nil { switch r := r.(type) { case error: err = r for _, ni := range newIds { g.Node(ni.ID()).ReleaseInterfaceID(ni.Ifc()) } // rollback default: panic(r) } } }() // Find all of the Adapter (internal) nodes reachable from an external interface. // Collect the ID of each node and update the modules table. for _, node := range nodes { if node.ID() < 0 { continue } provisionNode(g, node, &newIds) t.Walk(g, node, nil) } return }