69 lines
1.4 KiB
Go
69 lines
1.4 KiB
Go
|
package repository
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"regexp"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
/*
|
||
|
* Helm repo kinds: default/oci
|
||
|
*/
|
||
|
const (
|
||
|
HELM_REPO_OCI = "oci"
|
||
|
HELM_REPO_DEFAULT = "default"
|
||
|
)
|
||
|
|
||
|
type Repository struct {
|
||
|
Name string
|
||
|
URL string
|
||
|
Kind string `yaml:"-"`
|
||
|
}
|
||
|
|
||
|
type Repositories []*Repository
|
||
|
|
||
|
// ValidateURL returns error if the repo URL doens't follow the format
|
||
|
func (r *Repository) ValidateURL() error {
|
||
|
// An regex that should check if a string is a valid repo URL
|
||
|
const urlRegex = "^(http|https|oci):\\/\\/.*"
|
||
|
|
||
|
valid, err := regexp.MatchString(urlRegex, r.URL)
|
||
|
if err != nil {
|
||
|
return nil
|
||
|
}
|
||
|
if !valid {
|
||
|
return fmt.Errorf("it's not a valid repo URL: %s", r.URL)
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// KindFromUrl sets Repository.Kind according to the prefix of an URL
|
||
|
func (r *Repository) KindFromUrl() error {
|
||
|
// It panics if URL is not valid,
|
||
|
// but invalid url should not pass the ValidateURL function
|
||
|
if err := r.ValidateURL(); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
prefix := r.URL[:strings.IndexByte(r.URL, ':')]
|
||
|
switch prefix {
|
||
|
case "oci":
|
||
|
r.Kind = HELM_REPO_OCI
|
||
|
case "https", "http":
|
||
|
r.Kind = HELM_REPO_DEFAULT
|
||
|
default:
|
||
|
return fmt.Errorf("unknown repo kind: %s", prefix)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (rs Repositories) NameByUrl(repoURL string) (string, error) {
|
||
|
for _, r := range rs {
|
||
|
if repoURL == r.URL {
|
||
|
return r.Name, nil
|
||
|
}
|
||
|
}
|
||
|
return "", fmt.Errorf("repo couldn't be found in the config: %s", repoURL)
|
||
|
}
|