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  }