github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/internal/runners/packages/searchresult.go (about) 1 package packages 2 3 import ( 4 "strings" 5 6 "github.com/ActiveState/cli/internal/output" 7 "github.com/ActiveState/cli/internal/rtutils/ptr" 8 "github.com/ActiveState/cli/pkg/platform/model" 9 ) 10 11 type structuredSearchResults struct { 12 Results []*searchResult `locale:"," opts:"verticalTable" json:"Results,omitempty"` 13 packageNames []string 14 } 15 16 type searchResult struct { 17 Name string `opts:"omitEmpty" locale:"search_name, [HEADING]Name[/RESET]" json:"Name,omitempty"` 18 Description string `opts:"omitEmpty" locale:"search_description, [HEADING]Description[/RESET]" json:"Description,omitempty"` 19 Website string `opts:"omitEmpty" locale:"search_website, [HEADING]Website[/RESET]" json:"Website,omitempty"` 20 License string `opts:"omitEmpty" locale:"search_License, [HEADING]License[/RESET]" json:"License,omitempty"` 21 Versions []string `opts:"omitEmpty" locale:"search_versions, [HEADING]Versions[/RESET]" json:"Versions,omitempty"` 22 Vulnerabilities map[string]int `opts:"omitEmpty" locale:"search_vulnerabilities, [HEADING]Vulnerabilities[/RESET]" json:"Vulnerabilities,omitempty"` 23 version string 24 } 25 26 func createSearchResults(packages []*model.IngredientAndVersion, vulns []*model.VulnerabilityIngredient) (*structuredSearchResults, error) { 27 var results []*searchResult 28 var packageNames []string 29 for _, pkg := range packages { 30 result := &searchResult{} 31 result.Name = ptr.From(pkg.Ingredient.Name, "") 32 result.Description = ptr.From(pkg.Ingredient.Description, "") 33 result.Website = pkg.Ingredient.Website.String() 34 result.License = ptr.From(pkg.LatestVersion.LicenseExpression, "") 35 36 var versions []string 37 for _, v := range pkg.Versions { 38 versions = append(versions, v.Version) 39 } 40 if len(versions) > 0 { 41 result.Versions = versions 42 } 43 result.version = pkg.Version 44 45 var ingredientVulns *model.VulnerabilityIngredient 46 for _, v := range vulns { 47 if strings.EqualFold(v.Name, *pkg.Ingredient.Name) && 48 strings.EqualFold(v.PrimaryNamespace, *pkg.Ingredient.PrimaryNamespace) && 49 strings.EqualFold(v.Version, pkg.Version) { 50 ingredientVulns = v 51 break 52 } 53 } 54 55 if ingredientVulns != nil { 56 result.Vulnerabilities = ingredientVulns.Vulnerabilities.Count() 57 } 58 59 packageNames = append(packageNames, *pkg.Ingredient.Name) 60 results = append(results, result) 61 } 62 63 return &structuredSearchResults{ 64 Results: results, 65 packageNames: packageNames, 66 }, nil 67 } 68 69 func (s structuredSearchResults) MarshalStructured(_ output.Format) interface{} { 70 return s 71 }