mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-24 08:00:17 -06:00
eb2374070f
The addrs.Set type previously snuck in accidentally as part of the work to add addrs.UniqueKey and addrs.UniqueKeyer, because without support for generic types the addrs.Set type was a bit of a safety hazard due to not being able to enforce particular address types at compile time. However, with Go 1.18 adding support for type parameters we can now turn addrs.Set into a generic type over any specific addrs.UniqueKeyer type, and complement it with an addrs.Map type which supports addrs.UniqueKeyer keys as a way to encapsulate the handling of maps with UniqueKey keys that we currently do inline in various other parts of Terraform. This doesn't yet introduce any callers of these types, but we'll convert existing users of addrs.UniqueKeyer gradually in subsequent commits.
28 lines
956 B
Go
28 lines
956 B
Go
package addrs
|
|
|
|
// UniqueKey is an interface implemented by values that serve as unique map
|
|
// keys for particular addresses.
|
|
//
|
|
// All implementations of UniqueKey are comparable and can thus be used as
|
|
// map keys. Unique keys generated from different address types are always
|
|
// distinct. All functionally-equivalent keys for the same address type
|
|
// always compare equal, and likewise functionally-different values do not.
|
|
type UniqueKey interface {
|
|
uniqueKeySigil()
|
|
}
|
|
|
|
// UniqueKeyer is an interface implemented by types that can be represented
|
|
// by a unique key.
|
|
//
|
|
// Some address types naturally comply with the expectations of a UniqueKey
|
|
// and may thus be their own unique key type. However, address types that
|
|
// are not naturally comparable can implement this interface by returning
|
|
// proxy values.
|
|
type UniqueKeyer interface {
|
|
UniqueKey() UniqueKey
|
|
}
|
|
|
|
func Equivalent[T UniqueKeyer](a, b T) bool {
|
|
return a.UniqueKey() == b.UniqueKey()
|
|
}
|