mirror of
https://github.com/hashicorp/terraform.git
synced 2026-03-21 18:10:30 -04:00
74 lines
2.7 KiB
Go
74 lines
2.7 KiB
Go
// Copyright IBM Corp. 2014, 2026
|
|
// 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
|
|
}
|