get.porter.sh/porter@v1.3.0/pkg/pkgmgmt/install.go (about) 1 package pkgmgmt 2 3 import ( 4 "errors" 5 "fmt" 6 "net/url" 7 "path" 8 "strings" 9 ) 10 11 type InstallOptions struct { 12 PackageDownloadOptions 13 14 Name string 15 URL string 16 FeedURL string 17 Version string 18 parsedURL *url.URL 19 parsedFeedURL *url.URL 20 21 PackageType string 22 } 23 24 // GetParsedURL returns a copy of of the parsed URL that is safe to modify. 25 func (o *InstallOptions) GetParsedURL() url.URL { 26 if o.parsedURL == nil { 27 return url.URL{} 28 } 29 30 return *o.parsedURL 31 } 32 33 func (o *InstallOptions) GetParsedFeedURL() url.URL { 34 if o.parsedFeedURL == nil { 35 return o.defaultFeedURL() 36 } 37 38 return *o.parsedFeedURL 39 } 40 41 func (o *InstallOptions) defaultFeedURL() url.URL { 42 mirror := o.GetMirror() 43 mirror.Path = path.Join(mirror.Path, o.PackageType+"s", "atom.xml") 44 return mirror 45 } 46 47 func (o *InstallOptions) Validate(args []string) error { 48 if o.PackageType != "mixin" && o.PackageType != "plugin" { 49 return fmt.Errorf("invalid package type %q. Please report this as a bug to Porter!", o.PackageType) 50 } 51 52 err := o.validateName(args) 53 if err != nil { 54 return err 55 } 56 57 err = o.PackageDownloadOptions.Validate() 58 if err != nil { 59 return err 60 } 61 62 err = o.validateFeedURL() 63 if err != nil { 64 return err 65 } 66 67 err = o.validateURL() 68 if err != nil { 69 return err 70 } 71 72 o.defaultVersion() 73 74 return nil 75 } 76 77 func (o *InstallOptions) validateURL() error { 78 if o.URL == "" { 79 return nil 80 } 81 82 parsedURL, err := url.Parse(o.URL) 83 if err != nil { 84 return fmt.Errorf("invalid --url %s: %w", o.URL, err) 85 } 86 87 o.parsedURL = parsedURL 88 return nil 89 } 90 91 func (o *InstallOptions) validateFeedURL() error { 92 if o.URL == "" && o.FeedURL == "" { 93 feedURL := o.defaultFeedURL() 94 o.FeedURL = feedURL.String() 95 } 96 97 if o.FeedURL != "" { 98 parsedFeedURL, err := url.Parse(o.FeedURL) 99 if err != nil { 100 return fmt.Errorf("invalid --feed-url %s: %w", o.FeedURL, err) 101 } 102 103 o.parsedFeedURL = parsedFeedURL 104 } 105 106 return nil 107 } 108 109 func (o *InstallOptions) defaultVersion() { 110 if o.Version == "" { 111 o.Version = "latest" 112 } 113 } 114 115 // validateName grabs the name from the first positional argument. 116 func (o *InstallOptions) validateName(args []string) error { 117 switch len(args) { 118 case 0: 119 return errors.New("no name was specified") 120 case 1: 121 o.Name = strings.ToLower(args[0]) 122 return nil 123 default: 124 return fmt.Errorf("only one positional argument may be specified, the name, but multiple were received: %s", args) 125 126 } 127 }