mirror of
https://github.com/anchore/syft.git
synced 2025-11-18 17:03:17 +01:00
add coordinate set
Signed-off-by: Alex Goodman <alex.goodman@anchore.com>
This commit is contained in:
parent
d3b6419a34
commit
7bdd6e3ab0
@ -2,6 +2,7 @@ package source
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"sort"
|
||||||
|
|
||||||
"github.com/anchore/syft/internal/log"
|
"github.com/anchore/syft/internal/log"
|
||||||
"github.com/anchore/syft/syft/artifact"
|
"github.com/anchore/syft/syft/artifact"
|
||||||
@ -13,6 +14,18 @@ type Coordinates struct {
|
|||||||
FileSystemID string `json:"layerID,omitempty"` // An ID representing the filesystem. For container images, this is a layer digest. For directories or a root filesystem, this is blank.
|
FileSystemID string `json:"layerID,omitempty"` // An ID representing the filesystem. For container images, this is a layer digest. For directories or a root filesystem, this is blank.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CoordinateSet represents a set of string types.
|
||||||
|
type CoordinateSet map[Coordinates]struct{}
|
||||||
|
|
||||||
|
// NewCoordinateSet creates a CoordinateSet populated with values from the given slice.
|
||||||
|
func NewCoordinateSet(start ...Coordinates) CoordinateSet {
|
||||||
|
ret := make(CoordinateSet)
|
||||||
|
for _, s := range start {
|
||||||
|
ret.Add(s)
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
func (c Coordinates) ID() artifact.ID {
|
func (c Coordinates) ID() artifact.ID {
|
||||||
f, err := artifact.IDFromHash(c)
|
f, err := artifact.IDFromHash(c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -32,3 +45,37 @@ func (c Coordinates) String() string {
|
|||||||
}
|
}
|
||||||
return fmt.Sprintf("Location<%s>", str)
|
return fmt.Sprintf("Location<%s>", str)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add a string to the set.
|
||||||
|
func (s CoordinateSet) Add(i Coordinates) {
|
||||||
|
s[i] = struct{}{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove a string from the set.
|
||||||
|
func (s CoordinateSet) Remove(i Coordinates) {
|
||||||
|
delete(s, i)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Contains indicates if the given string is contained within the set.
|
||||||
|
func (s CoordinateSet) Contains(i Coordinates) bool {
|
||||||
|
_, ok := s[i]
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToSlice returns a sorted slice of Locations that are contained within the set.
|
||||||
|
func (s CoordinateSet) ToSlice() []Coordinates {
|
||||||
|
ret := make([]Coordinates, len(s))
|
||||||
|
idx := 0
|
||||||
|
for v := range s {
|
||||||
|
ret[idx] = v
|
||||||
|
idx++
|
||||||
|
}
|
||||||
|
|
||||||
|
sort.SliceStable(ret, func(i, j int) bool {
|
||||||
|
if ret[i].RealPath == ret[j].RealPath {
|
||||||
|
return ret[i].FileSystemID < ret[j].FileSystemID
|
||||||
|
}
|
||||||
|
return ret[i].RealPath < ret[j].RealPath
|
||||||
|
})
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user