pulsaradmin/pkg/utils/package_name.go (83 lines of code) (raw):

// Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. package utils import ( "fmt" "strings" "github.com/pkg/errors" ) type PackageName struct { packageType PackageType namespace string tenant string name string version string completePackageName string completeName string } func invalidPackageNameError(completeName string) error { return errors.Errorf("Invalid package name '%s', it should be "+ "in the format of type://tenant/namespace/name@version", completeName) } func GetPackageNameWithComponents(packageType PackageType, tenant, namespace, name, version string) (*PackageName, error) { return GetPackageName(fmt.Sprintf("%s://%s/%s/%s@%s", packageType, tenant, namespace, name, version)) } func GetPackageName(completeName string) (*PackageName, error) { var packageName PackageName var err error if !strings.Contains(completeName, "://") { return nil, invalidPackageNameError(completeName) } parts := strings.Split(completeName, "://") if len(parts) != 2 { return nil, invalidPackageNameError(completeName) } packageName.packageType, err = parsePackageType(parts[0]) if err != nil { return nil, err } rest := parts[1] if !strings.Contains(rest, "@") { // if the package name does not contains '@', that means user does not set the version of package. // We will set the version to latest. rest += "@" } parts = strings.Split(rest, "@") if len(parts) != 2 { return nil, invalidPackageNameError(completeName) } partsWithoutVersion := strings.Split(parts[0], "/") if len(partsWithoutVersion) != 3 { return nil, invalidPackageNameError(completeName) } packageName.tenant = partsWithoutVersion[0] packageName.namespace = partsWithoutVersion[1] packageName.name = partsWithoutVersion[2] packageName.version = "latest" if parts[1] != "" { packageName.version = parts[1] } packageName.completeName = fmt.Sprintf("%s/%s/%s", packageName.tenant, packageName.namespace, packageName.name) packageName.completePackageName = fmt.Sprintf("%s://%s/%s/%s@%s", packageName.packageType, packageName.tenant, packageName.namespace, packageName.name, packageName.version) return &packageName, nil } func (p *PackageName) String() string { return p.completePackageName } func (p *PackageName) GetType() PackageType { return p.packageType } func (p *PackageName) GetTenant() string { return p.tenant } func (p *PackageName) GetNamespace() string { return p.namespace } func (p *PackageName) GetName() string { return p.name } func (p *PackageName) GetVersion() string { return p.version } func (p *PackageName) GetCompleteName() string { return p.completeName }