get.porter.sh/porter@v1.3.0/pkg/porter/packages.go (about)

     1  package porter
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"get.porter.sh/porter/pkg/pkgmgmt"
     8  	"get.porter.sh/porter/pkg/printer"
     9  )
    10  
    11  // SearchOptions are options for searching packages
    12  type SearchOptions struct {
    13  	Name string
    14  	Type string
    15  	printer.PrintOptions
    16  	pkgmgmt.PackageDownloadOptions
    17  }
    18  
    19  // Validate validates the arguments provided to a search command
    20  func (o *SearchOptions) Validate(args []string) error {
    21  	if o.Type != "mixin" && o.Type != "plugin" {
    22  		return fmt.Errorf("unsupported package type: %s", o.Type)
    23  	}
    24  
    25  	err := o.validatePackageName(args)
    26  	if err != nil {
    27  		return err
    28  	}
    29  
    30  	err = o.PackageDownloadOptions.Validate()
    31  	if err != nil {
    32  		return err
    33  	}
    34  
    35  	return o.ParseFormat()
    36  }
    37  
    38  // validatePackageName validates either no package name is provided or only one is
    39  func (o *SearchOptions) validatePackageName(args []string) error {
    40  	switch len(args) {
    41  	case 0:
    42  		return nil
    43  	case 1:
    44  		o.Name = strings.ToLower(args[0])
    45  		return nil
    46  	default:
    47  		return fmt.Errorf("only one positional argument may be specified, the package name, but multiple were received: %s", args)
    48  	}
    49  }
    50  
    51  // SearchPackages searches the provided package list according to the provided options
    52  func (p *Porter) SearchPackages(opts SearchOptions) error {
    53  	url := pkgmgmt.GetPackageListURL(opts.GetMirror(), opts.Type)
    54  	list, err := pkgmgmt.GetPackageListings(url)
    55  	if err != nil {
    56  		return err
    57  	}
    58  
    59  	pkgSearcher := pkgmgmt.NewSearcher(list)
    60  	mixinList, err := pkgSearcher.Search(opts.Name, opts.Type)
    61  	if err != nil {
    62  		return err
    63  	}
    64  	return p.PrintPackages(opts, mixinList)
    65  }
    66  
    67  // PrintPackages prints the provided package list according to the provided options
    68  func (p *Porter) PrintPackages(opts SearchOptions, list pkgmgmt.PackageList) error {
    69  	switch opts.Format {
    70  	case printer.FormatPlaintext:
    71  		printMixinRow :=
    72  			func(v interface{}) []string {
    73  				m, ok := v.(pkgmgmt.PackageListing)
    74  				if !ok {
    75  					return nil
    76  				}
    77  
    78  				var urlType string
    79  				if strings.Contains(m.URL, ".xml") {
    80  					urlType = "Atom Feed"
    81  				} else if strings.Contains(m.URL, "download") {
    82  					urlType = "Download"
    83  				} else {
    84  					urlType = "Unknown"
    85  				}
    86  				return []string{m.Name, m.Description, m.Author, m.URL, urlType}
    87  			}
    88  		return printer.PrintTable(p.Out, list, printMixinRow, "Name", "Description", "Author", "URL", "URL Type")
    89  	case printer.FormatJson:
    90  		return printer.PrintJson(p.Out, list)
    91  	case printer.FormatYaml:
    92  		return printer.PrintYaml(p.Out, list)
    93  	default:
    94  		return fmt.Errorf("invalid format: %s", opts.Format)
    95  	}
    96  }