3
0
corteza/pkg/envoy/node.go
2020-11-27 11:19:15 +01:00

108 lines
1.7 KiB
Go

package envoy
import "github.com/cortezaproject/corteza-server/pkg/envoy/resource"
type (
// the node struct is used for nicer graph state management
nodeSet []*node
node struct {
res resource.Interface
pp nodeSet
cc nodeSet
}
nodeIndex map[string]map[string]*node
)
func newNode(res resource.Interface) *node {
return &node{
res: res,
cc: make(nodeSet, 0, 10),
pp: make(nodeSet, 0, 10),
}
}
func (nn nodeSet) add(mm ...*node) nodeSet {
return append(nn, mm...)
}
func (nn nodeSet) filter(f func(n *node) bool) nodeSet {
mm := make(nodeSet, 0, len(nn))
for _, n := range nn {
if f(n) {
mm = append(mm, n)
}
}
return mm
}
func (nn nodeSet) findByRef(ref *resource.Ref) *node {
for _, n := range nn {
if n.res.ResourceType() == ref.ResourceType {
if n.res.Identifiers().HasAny(ref.Identifiers) {
return n
}
}
}
return nil
}
func (nn nodeSet) has(m *node) bool {
for _, n := range nn {
if n == m {
return true
}
}
return false
}
func (nn nodeSet) remove(mm ...*node) nodeSet {
if len(mm) <= 0 {
return nn
}
nClean := make(nodeSet, 0, len(nn))
mmSet := make(nodeSet, 0, len(mm))
mmSet = append(mmSet, mm...)
for _, n := range nn {
if !mmSet.has(n) {
nClean = append(nClean, n)
}
}
return nClean
}
func (ri nodeIndex) Add(nn ...*node) {
for _, n := range nn {
rt := n.res.ResourceType()
if _, has := ri[rt]; !has {
ri[rt] = make(map[string]*node)
}
for i := range n.res.Identifiers() {
ri[rt][i] = n
}
}
}
func (ri nodeIndex) GetRef(ref *resource.Ref) *node {
res, has := ri[ref.ResourceType]
if !has {
return nil
}
for i := range ref.Identifiers {
r, has := res[i]
if has {
return r
}
}
return nil
}