mirror of https://github.com/fluxcd/cli-utils.git
45 lines
1.0 KiB
Go
45 lines
1.0 KiB
Go
// Copyright 2022 The Kubernetes Authors.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package graph
|
|
|
|
import (
|
|
"sort"
|
|
|
|
"github.com/fluxcd/cli-utils/pkg/object"
|
|
)
|
|
|
|
// Edge encapsulates a pair of vertices describing a
|
|
// directed edge.
|
|
type Edge struct {
|
|
From object.ObjMetadata
|
|
To object.ObjMetadata
|
|
}
|
|
|
|
// SortableEdges sorts a list of edges alphanumerically by From and then To.
|
|
type SortableEdges []Edge
|
|
|
|
var _ sort.Interface = SortableEdges{}
|
|
|
|
func (a SortableEdges) Len() int { return len(a) }
|
|
func (a SortableEdges) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
|
|
func (a SortableEdges) Less(i, j int) bool {
|
|
if a[i].From != a[j].From {
|
|
return metaIsLessThan(a[i].From, a[j].From)
|
|
}
|
|
return metaIsLessThan(a[i].To, a[j].To)
|
|
}
|
|
|
|
func metaIsLessThan(i, j object.ObjMetadata) bool {
|
|
if i.GroupKind.Group != j.GroupKind.Group {
|
|
return i.GroupKind.Group < j.GroupKind.Group
|
|
}
|
|
if i.GroupKind.Kind != j.GroupKind.Kind {
|
|
return i.GroupKind.Kind < j.GroupKind.Kind
|
|
}
|
|
if i.Namespace != j.Namespace {
|
|
return i.Namespace < j.Namespace
|
|
}
|
|
return i.Name < j.Name
|
|
}
|