blob: f0ebd774efced0e8b8b91ceb91c2d552c10d067e [file] [log] [blame]
// Copyright Istio Authors
//
// Licensed 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 resource
import (
"fmt"
"strings"
)
// Namespace containing the resource.
type Namespace string
func (n Namespace) String() string {
return string(n)
}
// LocalName that uniquely identifies the resource within the Namespace.
type LocalName string
func (n LocalName) String() string {
return string(n)
}
// FullName is a name that uniquely identifies a resource within the mesh.
type FullName struct {
Namespace Namespace
Name LocalName
}
// String interface implementation.
func (n FullName) String() string {
if len(n.Namespace) == 0 {
return string(n.Name)
}
return string(n.Namespace) + "/" + string(n.Name)
}
// NewShortOrFullName tries to parse the given name to resource.Name. If the name does not include namespace information,
// the defaultNamespace is used.
func NewShortOrFullName(defaultNamespace Namespace, name string) FullName {
parts := strings.SplitN(name, "/", 2)
if len(parts) == 1 {
return FullName{
Namespace: defaultNamespace,
Name: LocalName(parts[0]),
}
}
return FullName{
Namespace: Namespace(parts[0]),
Name: LocalName(parts[1]),
}
}
// Validate that the Name and Namespace are set.
func (n FullName) Validate() error {
if len(n.Name) == 0 {
return fmt.Errorf("invalid name '%s': name must not be empty", n.String())
}
return nil
}
// NewFullName creates a new FullName from the given Namespace and Name.
func NewFullName(ns Namespace, n LocalName) FullName {
return FullName{
Namespace: ns,
Name: n,
}
}
// ParseFullName parses the given name string that was serialized via FullName.String()
func ParseFullName(name string) (FullName, error) {
return ParseFullNameWithDefaultNamespace("", name)
}
// ParseFullName parses the given name string using defaultNamespace if no namespace is found.
func ParseFullNameWithDefaultNamespace(defaultNamespace Namespace, name string) (FullName, error) {
out := NewShortOrFullName(defaultNamespace, name)
if err := out.Validate(); err != nil {
return FullName{}, fmt.Errorf("failed parsing name '%v': %v", name, err)
}
return out, nil
}