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 }