forked from security/hakurei
80 lines
1.8 KiB
Go
80 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"cmp"
|
|
"slices"
|
|
|
|
"hakurei.app/internal/pkg"
|
|
"hakurei.app/internal/rosa"
|
|
)
|
|
|
|
type SortOrders int
|
|
|
|
const (
|
|
DeclarationAscending SortOrders = iota
|
|
DeclarationDescending
|
|
NameAscending
|
|
NameDescending
|
|
limitSortOrders
|
|
)
|
|
|
|
type PackageIndex struct {
|
|
sorts [limitSortOrders][rosa.PresetUnexportedStart]*PackageIndexEntry
|
|
names map[string]*PackageIndexEntry
|
|
}
|
|
|
|
type PackageIndexEntry struct {
|
|
Name string `json:"name"`
|
|
Description string `json:"description"`
|
|
Website string `json:"website"`
|
|
Version string `json:"version"`
|
|
status []byte
|
|
}
|
|
|
|
func createPackageIndex(cache *pkg.Cache, report *rosa.Report) (_ *PackageIndex, err error) {
|
|
index := new(PackageIndex)
|
|
index.names = make(map[string]*PackageIndexEntry, rosa.PresetUnexportedStart)
|
|
work := make([]PackageIndexEntry, rosa.PresetUnexportedStart)
|
|
defer report.HandleAccess(&err)()
|
|
for p := range rosa.PresetUnexportedStart {
|
|
m := rosa.GetMetadata(p)
|
|
v := rosa.Std.Version(p)
|
|
a := rosa.Std.Load(p)
|
|
id := cache.Ident(a)
|
|
st, n := report.ArtifactOf(id)
|
|
var status []byte
|
|
if n < 1 {
|
|
status = nil
|
|
} else {
|
|
status = st
|
|
}
|
|
entry := PackageIndexEntry{
|
|
Name: m.Name,
|
|
Description: m.Description,
|
|
Website: m.Website,
|
|
Version: v,
|
|
status: status,
|
|
}
|
|
work[p] = entry
|
|
index.names[m.Name] = &entry
|
|
}
|
|
for i, p := range work {
|
|
index.sorts[DeclarationAscending][i] = &p
|
|
}
|
|
slices.Reverse(work)
|
|
for i, p := range work {
|
|
index.sorts[DeclarationDescending][i] = &p
|
|
}
|
|
slices.SortFunc(work, func(a PackageIndexEntry, b PackageIndexEntry) int {
|
|
return cmp.Compare(a.Name, b.Name)
|
|
})
|
|
for i, p := range work {
|
|
index.sorts[NameAscending][i] = &p
|
|
}
|
|
slices.Reverse(work)
|
|
for i, p := range work {
|
|
index.sorts[NameDescending][i] = &p
|
|
}
|
|
return index, err
|
|
}
|