mirror of
https://github.com/hashicorp/terraform.git
synced 2026-03-21 18:10:30 -04:00
57 lines
1.7 KiB
Go
57 lines
1.7 KiB
Go
// Copyright IBM Corp. 2014, 2026
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
package collections
|
|
|
|
import (
|
|
"github.com/google/go-cmp/cmp"
|
|
)
|
|
|
|
// CmpOptions is a set of options for use with the "go-cmp" module when
|
|
// comparing data structures that contain collection types from this package.
|
|
//
|
|
// Specifically, these options arrange for [Set] and [Map] values to be
|
|
// transformed into map[any]any to allow for element-based comparisons.
|
|
//
|
|
// [Set] of T values transform into a map whose keys have dynamic type
|
|
// UniqueKey[T] and whose values have dynamic type T.
|
|
//
|
|
// [Map] of K, V values transform into a map whose keys have dynamic type
|
|
// UniqueKey[K] and whose values have dynamic type MapElem[K, V].
|
|
var CmpOptions cmp.Option
|
|
|
|
func init() {
|
|
CmpOptions = cmp.Options([]cmp.Option{
|
|
cmp.Transformer("collectionElementsRaw", func(v transformerForCmp) any {
|
|
return v.transformForCmp()
|
|
}),
|
|
})
|
|
}
|
|
|
|
// transformerForCmp is a helper interface implemented by both `Set` and `Map`
|
|
// types, to work around the fact that go-cmp does all its work with reflection
|
|
// and thus cannot rely on the static type information from the type
|
|
// parameters.
|
|
type transformerForCmp interface {
|
|
transformForCmp() any
|
|
}
|
|
|
|
func (s Set[T]) transformForCmp() any {
|
|
ret := make(map[any]any, s.Len())
|
|
// It's okay to access the keys here because this package is allowed to
|
|
// depend on its own implementation details.
|
|
for k, v := range s.members {
|
|
ret[k] = v
|
|
}
|
|
return ret
|
|
}
|
|
|
|
func (m Map[K, V]) transformForCmp() any {
|
|
ret := make(map[any]any, m.Len())
|
|
// It's okay to access the keys here because this package is allowed to
|
|
// depend on its own implementation details.
|
|
for k, v := range m.elems {
|
|
ret[k] = v
|
|
}
|
|
return ret
|
|
}
|