package utils import ( "net/url" "strings" "github.com/pkg/errors" ) // TypeLocal represents github const TypeLocal = "local" // TypeOss represent oss const TypeOss = "oss" // TypeGithub represents github const TypeGithub = "github" // TypeUnknown represents parse failed const TypeUnknown = "unknown" // Content contains different type of content needed when building Registry type Content struct { OssContent GithubContent LocalContent } // LocalContent for local registry type LocalContent struct { AbsDir string `json:"abs_dir"` } // OssContent for oss registry type OssContent struct { BucketURL string `json:"bucket_url"` } // GithubContent for cap center type GithubContent struct { Owner string `json:"owner"` Repo string `json:"repo"` Path string `json:"path"` Ref string `json:"ref"` } // Parse will parse config from address func Parse(addr string) (string, *Content, error) { URL, err := url.Parse(addr) if err != nil { return "", nil, err } l := strings.Split(strings.TrimPrefix(URL.Path, "/"), "/") switch URL.Scheme { case "http", "https": switch URL.Host { case "github.com": // We support two valid format: // 1. https://github.com///tree// // 2. https://github.com/// if len(l) < 3 { return "", nil, errors.New("invalid format " + addr) } if l[2] == "tree" { // https://github.com///tree// if len(l) < 5 { return "", nil, errors.New("invalid format " + addr) } return TypeGithub, &Content{ GithubContent: GithubContent{ Owner: l[0], Repo: l[1], Path: strings.Join(l[4:], "/"), Ref: l[3], }, }, nil } // https://github.com/// return TypeGithub, &Content{ GithubContent: GithubContent{ Owner: l[0], Repo: l[1], Path: strings.Join(l[2:], "/"), Ref: "", // use default branch }, }, nil case "api.github.com": if len(l) != 5 { return "", nil, errors.New("invalid format " + addr) } //https://api.github.com/repos///contents/ return TypeGithub, &Content{ GithubContent: GithubContent{ Owner: l[1], Repo: l[2], Path: l[4], Ref: URL.Query().Get("ref"), }, }, nil default: } case "oss": return TypeOss, &Content{ OssContent: OssContent{ BucketURL: URL.Host, }, }, nil case "file": return TypeLocal, &Content{ LocalContent: LocalContent{ AbsDir: URL.Path, }, }, nil } return TypeUnknown, nil, nil }