Files
grafana/pkg/services/store/kind/dashboard/reference.go
2022-10-08 12:05:46 -04:00

54 lines
1.1 KiB
Go

package dashboard
import (
"fmt"
"sort"
"github.com/grafana/grafana/pkg/models"
)
// A reference accumulator can combine
type ReferenceAccumulator interface {
// Add references as we find them
Add(kind string, subtype string, uid string)
// Returns the set of distinct references in a sorted order
Get() []*models.ObjectExternalReference
}
func NewReferenceAccumulator() ReferenceAccumulator {
return &referenceAccumulator{
refs: make(map[string]*models.ObjectExternalReference),
}
}
type referenceAccumulator struct {
refs map[string]*models.ObjectExternalReference
}
func (x *referenceAccumulator) Add(kind string, sub string, uid string) {
key := fmt.Sprintf("%s/%s/%s", kind, sub, uid)
_, ok := x.refs[key]
if !ok {
x.refs[key] = &models.ObjectExternalReference{
Kind: kind,
Type: sub,
UID: uid,
}
}
}
func (x *referenceAccumulator) Get() []*models.ObjectExternalReference {
keys := make([]string, 0, len(x.refs))
for k := range x.refs {
keys = append(keys, k)
}
sort.Strings(keys)
refs := make([]*models.ObjectExternalReference, len(keys))
for i, key := range keys {
refs[i] = x.refs[key]
}
return refs
}