// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
package resource
import (
"fmt"
"strings"
"github.com/hashicorp/consul/proto-public/pbresource"
)
// ReferenceKey is the pointer-free representation of a ReferenceOrID
// suitable for a go map key.
type ReferenceKey struct {
GVK string
Partition string // Tenancy.*
Namespace string // Tenancy.*
// TODO(peering/v2) account for peer tenancy
Name string
}
// String returns a string representation of the ReferenceKey. This should not
// be relied upon nor parsed and is provided just for debugging and logging
// reasons.
//
// This format should be aligned with IDToString and ReferenceToString.
func ( r ReferenceKey ) String ( ) string {
// TODO(peering/v2) account for peer tenancy
return fmt . Sprintf ( "%s/%s.%s/%s" ,
r . GVK ,
orDefault ( r . Partition , "default" ) ,
orDefault ( r . Namespace , "default" ) ,
r . Name ,
)
}
func ( r ReferenceKey ) GetTenancy ( ) * pbresource . Tenancy {
return & pbresource . Tenancy {
Partition : r . Partition ,
Namespace : r . Namespace ,
}
}
// ToReference converts this back into a pbresource.ID.
func ( r ReferenceKey ) ToID ( ) * pbresource . ID {
return & pbresource . ID {
Type : GVKToType ( r . GVK ) ,
Tenancy : r . GetTenancy ( ) ,
Name : r . Name ,
}
}
// ToReference converts this back into a pbresource.Reference.
func ( r ReferenceKey ) ToReference ( ) * pbresource . Reference {
return & pbresource . Reference {
Type : GVKToType ( r . GVK ) ,
Tenancy : r . GetTenancy ( ) ,
Name : r . Name ,
}
}
func ( r ReferenceKey ) GoString ( ) string { return r . String ( ) }
func NewReferenceKey ( refOrID ReferenceOrID ) ReferenceKey {
return ReferenceKey {
GVK : ToGVK ( refOrID . GetType ( ) ) ,
Partition : orDefault ( refOrID . GetTenancy ( ) . GetPartition ( ) , "default" ) ,
Namespace : orDefault ( refOrID . GetTenancy ( ) . GetNamespace ( ) , "default" ) ,
Name : refOrID . GetName ( ) ,
}
}
func orDefault ( v , def string ) string {
if v == "" {
return def
}
return v
}
func GVKToType ( gvk string ) * pbresource . Type {
parts := strings . Split ( gvk , "." )
if len ( parts ) != 3 {
panic ( "bad gvk" )
}
return & pbresource . Type {
Group : parts [ 0 ] ,
GroupVersion : parts [ 1 ] ,
Kind : parts [ 2 ] ,
}
}