aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Amsterdam <jba@google.com>2026-04-09 12:49:44 -0400
committerJonathan Amsterdam <jba@google.com>2026-04-09 11:29:52 -0700
commit845e9f3a89f1a84a47606ae3b50cb3fb91b2d95a (patch)
tree895cf112d202ea8e66e2b42c4b8fd547160c9588
parentb0096dc799437fdf92fc65135a7141fa8ad358be (diff)
downloadgo-x-pkgsite-845e9f3a89f1a84a47606ae3b50cb3fb91b2d95a.tar.xz
internal/api: simplify filter code
Change-Id: I5510faeb196af4ce1418affe6159b17187b9efa5 Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/764700 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Ethan Lee <ethanalee@google.com> kokoro-CI: kokoro <noreply+kokoro@google.com>
-rw-r--r--internal/api/api.go71
1 files changed, 40 insertions, 31 deletions
diff --git a/internal/api/api.go b/internal/api/api.go
index daf3ffdb..7a643271 100644
--- a/internal/api/api.go
+++ b/internal/api/api.go
@@ -168,13 +168,9 @@ func ServeModuleVersions(w http.ResponseWriter, r *http.Request, ds internal.Dat
}
if params.Filter != "" {
- var filtered []*internal.ModuleInfo
- for _, info := range infos {
- if strings.Contains(info.Version, params.Filter) {
- filtered = append(filtered, info)
- }
- }
- infos = filtered
+ infos = filter(infos, func(info *internal.ModuleInfo) bool {
+ return strings.Contains(info.Version, params.Filter)
+ })
}
resp, err := paginate(infos, params.ListParams, defaultLimit)
@@ -210,12 +206,14 @@ func ServeModulePackages(w http.ResponseWriter, r *http.Request, ds internal.Dat
return err
}
- var items []Package
+ if params.Filter != "" {
+ metas = filter(metas, func(m *internal.PackageMeta) bool {
+ return strings.Contains(m.Path, params.Filter) || strings.Contains(m.Synopsis, params.Filter)
+ })
+ }
+ var results []Package
for _, m := range metas {
- if params.Filter != "" && !strings.Contains(m.Path, params.Filter) && !strings.Contains(m.Synopsis, params.Filter) {
- continue
- }
- items = append(items, Package{
+ results = append(results, Package{
Path: m.Path,
ModulePath: modulePath,
ModuleVersion: requestedVersion,
@@ -224,7 +222,7 @@ func ServeModulePackages(w http.ResponseWriter, r *http.Request, ds internal.Dat
})
}
- resp, err := paginate(items, params.ListParams, defaultLimit)
+ resp, err := paginate(results, params.ListParams, defaultLimit)
if err != nil {
return err
}
@@ -254,13 +252,13 @@ func ServeSearch(w http.ResponseWriter, r *http.Request, ds internal.DataSource)
return err
}
+ if params.Filter != "" {
+ dbresults = filter(dbresults, func(r *internal.SearchResult) bool {
+ return strings.Contains(r.Synopsis, params.Filter) || strings.Contains(r.PackagePath, params.Filter)
+ })
+ }
var results []SearchResult
for _, r := range dbresults {
- if params.Filter != "" {
- if !strings.Contains(r.Synopsis, params.Filter) && !strings.Contains(r.PackagePath, params.Filter) {
- continue
- }
- }
results = append(results, SearchResult{
PackagePath: r.PackagePath,
ModulePath: r.ModulePath,
@@ -306,11 +304,13 @@ func ServePackageSymbols(w http.ResponseWriter, r *http.Request, ds internal.Dat
return err
}
+ if params.Filter != "" {
+ syms = filter(syms, func(s *internal.Symbol) bool {
+ return strings.Contains(s.Name, params.Filter) || strings.Contains(s.Synopsis, params.Filter)
+ })
+ }
var items []Symbol
for _, s := range syms {
- if params.Filter != "" && !strings.Contains(s.Name, params.Filter) && !strings.Contains(s.Synopsis, params.Filter) {
- continue
- }
items = append(items, Symbol{
ModulePath: um.ModulePath,
Version: um.Version,
@@ -365,13 +365,9 @@ func ServePackageImportedBy(w http.ResponseWriter, r *http.Request, ds internal.
}
if params.Filter != "" {
- var filtered []string
- for _, p := range importedBy {
- if strings.Contains(p, params.Filter) {
- filtered = append(filtered, p)
- }
- }
- importedBy = filtered
+ importedBy = filter(importedBy, func(p string) bool {
+ return strings.Contains(p, params.Filter)
+ })
}
paged, err := paginate(importedBy, params.ListParams, defaultLimit)
@@ -421,11 +417,13 @@ func ServeVulnerabilities(vc *vuln.Client) func(w http.ResponseWriter, r *http.R
// Passing an empty packagePath gets all vulns for the module.
vulns := vuln.VulnsForPackage(r.Context(), modulePath, requestedVersion, "", vc)
+ if params.Filter != "" {
+ vulns = filter(vulns, func(v vuln.Vuln) bool {
+ return strings.Contains(v.ID, params.Filter) || strings.Contains(v.Details, params.Filter)
+ })
+ }
var items []Vulnerability
for _, v := range vulns {
- if params.Filter != "" && !strings.Contains(v.ID, params.Filter) && !strings.Contains(v.Details, params.Filter) {
- continue
- }
items = append(items, Vulnerability{
ID: v.ID,
Details: v.Details,
@@ -675,3 +673,14 @@ func versionCacheDur(v string) time.Duration {
}
return shortCacheDur
}
+
+// filter returns a new slice containing all elements in list for which pred is true.
+func filter[T any](list []T, pred func(T) bool) []T {
+ var out []T
+ for _, e := range list {
+ if pred(e) {
+ out = append(out, e)
+ }
+ }
+ return out
+}