Ejemplo n.º 1
0
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
}