mirror of
https://github.com/opentffoundation/opentf.git
synced 2026-02-16 16:00:37 -05:00
Previously we were attempting to infer the checkable object address kind of a given address by whether it included "output" in the position where a resource type name would otherwise go. That was already potentially risky because we've historically not prevented a resource type named "output", and it's also a forward-compatibility hazard in case we introduce additional object kinds with entirely-new addressing schemes in future. Given that, we'll instead always be explicit about what kind of address we're storing in a wire or file format, so that we can make sure to always use the intended parser when reading an address back into memory, or return an error if we encounter a kind we're not familiar with.
80 lines
1.9 KiB
Go
80 lines
1.9 KiB
Go
package jsonchecks
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/hashicorp/terraform/internal/addrs"
|
|
)
|
|
|
|
type staticObjectAddr map[string]interface{}
|
|
|
|
func makeStaticObjectAddr(addr addrs.ConfigCheckable) staticObjectAddr {
|
|
ret := map[string]interface{}{
|
|
"to_display": addr.String(),
|
|
}
|
|
|
|
switch addr := addr.(type) {
|
|
case addrs.ConfigResource:
|
|
if kind := addr.CheckableKind(); kind != addrs.CheckableResource {
|
|
// Something has gone very wrong
|
|
panic(fmt.Sprintf("%T has CheckableKind %s", addr, kind))
|
|
}
|
|
|
|
ret["kind"] = "resource"
|
|
switch addr.Resource.Mode {
|
|
case addrs.ManagedResourceMode:
|
|
ret["mode"] = "managed"
|
|
case addrs.DataResourceMode:
|
|
ret["mode"] = "data"
|
|
default:
|
|
panic(fmt.Sprintf("unsupported resource mode %#v", addr.Resource.Mode))
|
|
}
|
|
ret["type"] = addr.Resource.Type
|
|
ret["name"] = addr.Resource.Name
|
|
if !addr.Module.IsRoot() {
|
|
ret["module"] = addr.Module.String()
|
|
}
|
|
case addrs.ConfigOutputValue:
|
|
if kind := addr.CheckableKind(); kind != addrs.CheckableOutputValue {
|
|
// Something has gone very wrong
|
|
panic(fmt.Sprintf("%T has CheckableKind %s", addr, kind))
|
|
}
|
|
|
|
ret["kind"] = "output_value"
|
|
ret["name"] = addr.OutputValue.Name
|
|
if !addr.Module.IsRoot() {
|
|
ret["module"] = addr.Module.String()
|
|
}
|
|
default:
|
|
panic(fmt.Sprintf("unsupported ConfigCheckable implementation %T", addr))
|
|
}
|
|
|
|
return ret
|
|
}
|
|
|
|
type dynamicObjectAddr map[string]interface{}
|
|
|
|
func makeDynamicObjectAddr(addr addrs.Checkable) dynamicObjectAddr {
|
|
ret := map[string]interface{}{
|
|
"to_display": addr.String(),
|
|
}
|
|
|
|
switch addr := addr.(type) {
|
|
case addrs.AbsResourceInstance:
|
|
if !addr.Module.IsRoot() {
|
|
ret["module"] = addr.Module.String()
|
|
}
|
|
if addr.Resource.Key != addrs.NoKey {
|
|
ret["instance_key"] = addr.Resource.Key
|
|
}
|
|
case addrs.AbsOutputValue:
|
|
if !addr.Module.IsRoot() {
|
|
ret["module"] = addr.Module.String()
|
|
}
|
|
default:
|
|
panic(fmt.Sprintf("unsupported Checkable implementation %T", addr))
|
|
}
|
|
|
|
return ret
|
|
}
|