blob: 6b647de189f8a9ad7db400b402f0068516e7dc1f [file] [log] [blame]
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
package statekeys
// Key is implemented by types that can be used as state keys.
type Key interface {
// KeyType returns the [KeyType] used for keys belonging to a particular
// implementation of [Key].
KeyType() KeyType
// rawSuffix returns additional characters that should appear after the
// key type portion of the final raw key.
//
// This is unexported both to help prevent accidental misuse (external
// callers MUST use [String] to obtain the correct string representation],
// and to prevent implementations of this interface from other packages.
// This package is the sole authority on state keys.
rawSuffix() string
}
// String returns the string representation of the given key, ready to be used
// in the RPC API representation of a [stackstate.AppliedChange] object.
func String(k Key) string {
if k == nil {
panic("called statekeys.String with nil Key")
}
return string(k.KeyType()) + k.rawSuffix()
}
// RecognizedType returns true if the given key has a [KeyType] that's known
// to the current version of this package, or false otherwise.
//
// If RecognizedType returns false, use the key's KeyType method to obtain
// the unrecognized type and then use its UnrecognizedKeyHandling method
// to determine the appropriate handling for the unrecognized key type.
func RecognizedType(k Key) bool {
if k == nil {
panic("called statekeys.RecognizedType with nil Key")
}
_, unrecognized := k.(Unrecognized)
return !unrecognized
}
// Unrecognized is a fallback [Key] implementation used when a given
// key has an unrecognized type.
//
// Unrecognized keys are round-trippable in that the RawKey method will return
// the same string that was originally parsed. Use
// KeyType.UnrecognizedKeyHandling to determine how Terraform Core should
// respond to the key having an unrecognized type.
type Unrecognized struct {
// ApparentKeyType is a [KeyType] representation of the type portion of the
// unrecognized key. Unlike most other [KeyType] values, this one
// will presumably not match any of the [KeyType] constants defined
// elsewhere in this package.
ApparentKeyType KeyType
// Remainder is a verbatim copy of whatever appeared after the type
// in the given key string. This is preserved only for round-tripping
// purposes and so should be treated as opaque.
remainder string
}
// KeyType returns the value from the ApparentKeyType field, which will
// presumably not match any of the [KeyType] constants in this package
// (because otherwise we would've used a different implementation of [Key]).
func (k Unrecognized) KeyType() KeyType {
return k.ApparentKeyType
}
func (k Unrecognized) rawSuffix() string {
return k.remainder
}